递归遍历 二叉树 求高度 和 节点数 和 叶子节点数

#include <iostream>
#include <cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;

struct Node
{
    char data;
    Node *lchild;
    Node *rchild;
};

int  nodes(Node *T)
{
    if(T==NULL)  return 0;
    else if(T->lchild==NULL&&T->rchild==NULL)
        return 1;
    else
        return nodes(T->lchild)+nodes(T->rchild)+1;
}

void CountLeaf(Node *T,int &num)
{
    if(T!=NULL)
    {
        if(T->lchild==NULL&&T->rchild==NULL)
            num++;
        CountLeaf(T->lchild,num);
        CountLeaf(T->rchild,num);
    }
}

void High(Node *T, int &h)
{
    if (T == NULL)
        h = 0;
    else
    {
        int left_h;
        High(T->lchild, left_h);
        int right_h;
        High(T->rchild, right_h);
        h = 1 + max(left_h, right_h);
    }
}

Node  *CreateBiTree(Node *&T)
{

    char ch;
    cin>>ch;
    if (ch == '#')
        T = NULL;
    else
    {
        if (!(T = (Node *)malloc(sizeof(Node))))
            return 0;
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
        return T;
    }
}

void Free(Node *&T)
{
    if (T == NULL)
        return;

    Free(T->lchild);
    //	T->lchild = NULL;
    Free(T->rchild);
    //	T->rchild = NULL;
    free(T);
    T = NULL;
}

int main( )
{

    Node *T = NULL;
    CreateBiTree(T);
    int num=0;
    int height;
    High(T, height);
    cout<<height<<endl;
    CountLeaf(T,num);
    cout<<num<<endl;
    Free(T);

    return 0;
}

/* cin.txt:
A
B
C
#
#
D
E
#
G
#
#
F
#
#
#
*/

时间: 2024-08-29 21:00:15

递归遍历 二叉树 求高度 和 节点数 和 叶子节点数的相关文章

二叉树递归与非递归遍历,最近公共父节点算法

#include <iostream> #include <stack> using namespace std; #define MAX 100 //字符串最大长度 typedef struct Node //二叉树结点 { char data; Node *lchild,*rchild; } *Btree; void createBT(Btree &t); //先序构造二叉树 void preorder(Btree &t); //二叉树递归先序遍历 void i

中根递归遍历二叉树,并输出权值大于50的节点

/** * @author 黄志伟 */ public class Search{ public static void main(String[] args){ Node A = new Node(); A.setValue(51); Node B = new Node(); B.setValue(52); Node C = new Node(); C.setValue(53); Node D = new Node(); D.setValue(49); Node E = new Node();

【转】更简单的非递归遍历二叉树的方法

解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所以网上出现无数的介绍二叉树非递归遍历方法的文章.可是大家需要的真是那些非递归遍历代码和讲述吗?代码早在学数据结构时就看懂了,理解了,可为什么我们一而再再而三地忘记非递归遍历方法,却始终记住了递归遍历方法? 三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担.

重拾算法(1)——优雅地非递归遍历二叉树及其它

重拾算法(1)——优雅地非递归遍历二叉树及其它 本文中非递归遍历二叉树的思想和代码都来自这里(http://jianshu.io/p/49c8cfd07410#).我认为其思想和代码都足够优雅动人了,于是稍作整理,得到如下的程序. 前中后序遍历二叉树 1 public class BinaryTreeNode<T> 2 { 3 public T Value { get;set; } 4 public BinaryTreeNode<T> Parent { get;set; } 5 p

非递归遍历二叉树Java实现

2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Binary Tree Preorder Traversal 问题描述: 问题求解: 先序遍历就是在第一次访问到节点的时候将其值进行打印,然后递归打印其左子树,最后递归打印其右子树. 解法一.双while public List<Integer> preorderTraversal(TreeNode

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

二叉树(8)----求二叉树第K层的节点数和二叉树第K层的叶子节点数,递归方式

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 2.求二叉树第K层的节点数 (1)递归方式 给定根节点pRoot: 如

Java二叉树的递归,非递归遍历,高度,节点数,叶子节点数

import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class Main { public static class TreeNode<T>{ T data; TreeNode<T> left=null; TreeNode<T> right=null; public TreeNode() {} public TreeNode(T data){ this.d