二叉树的建立、遍历、叶子节点计数、深度计算

直接上代码,有空解释

注意这种建树方式为先序建立

sampleinput

ABD*F***CE***

输出

先序遍历结果
ABDFCE
中序遍历结果
DFBAEC
后序遍历结果
FDBECA
树的深度为4
叶节点个数为2

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <iostream>

using namespace std;

struct Node
{
    char data;
    struct Node *l, *r;
};
int sum = 0;

struct Node *Creat(struct Node *p)
{
    char q;
    scanf("%c", &q);
    if(q == ‘*‘)
        p = NULL;
    else
    {
        p = (struct Node *)malloc(sizeof(struct Node));
        p->data = q;
        p->l = Creat(p->l);
        p->r = Creat(p->r);
    }
    return p;
}
int Xianxu(struct Node *p)
{
    if(p)
    {
        printf("%c", p->data);
        Xianxu(p->l);
        Xianxu(p->r);
    }
    return 0;
}
int Zhongxu(struct Node *p)
{
    if(p)
    {
        Zhongxu(p->l);
        printf("%c", p->data);
        Zhongxu(p->r);
    }
    return 0;
}
int Houxu(struct Node *p)
{
    if(p)
    {
        Houxu(p->l);
        Houxu(p->r);
        printf("%c", p->data);
    }
    return 0;
}
int Deep(struct Node *p)
{
    int c1, c2;
    if(!p)
        return 0;
    c1 = Deep(p->l);
    c2 = Deep(p->r);
    return c1 > c2 ? c1+1 : c2+1;
}
int Jiedian(struct Node *p)
{
    if(p)
    {
        Jiedian(p->l);
        Jiedian(p->r);
        if((p->l == NULL) && (p->r == NULL))
            sum++;
    }
    return sum;
}
int main()
{
    int sum;
    struct Node *head;
    head = (struct Node *)malloc(sizeof(struct Node));
    head = Creat(head);
    printf("先序遍历结果\n");
    Xianxu(head);
    printf("\n");

    printf("中序遍历结果\n");
    Zhongxu(head);
    printf("\n");

    printf("后序遍历结果\n");
    Houxu(head);
    printf("\n");

    printf("树的深度为%d\n", Deep(head));
    sum = Jiedian(head);
    printf("叶节点个数为%d\n", sum);
    return 0;
}
时间: 2024-10-21 23:41:32

二叉树的建立、遍历、叶子节点计数、深度计算的相关文章

求二叉树的高度,叶子节点个数,第K层结点个数,求祖先结点问题

一.求二叉树的高度 类似归并排序的思想.先求最底层结点的高度,再分别比较生成更高的结点的高度.最后递归至根结点,求出根结点的高度. //求二叉树的高度 int Height() { return GetHeight(_root); } int GetHeight(Node<T> *root) { int left = 0; int right = 0; if (root->_leftchild != NULL) left += GetHeight(root->_leftchild)

二叉树(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: 如

设计一个算法,输出从每个叶子节点到根节点的逆路径

下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储. 方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置.当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径.对应的算法如下: void AllPath(BTNode * b) { struct snode { BTNode *node; //存放当前节点指针 int parent; //存放双亲节点在队列中的位置 } Qu[MaxSize]

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

关于二叉树,建立、遍历、求节点最大距离

今天做了一题求二叉树节点的最大距离,顺便写了下二叉树的建立,遍历的过程. 我觉得这题的主要思想是深度遍历+动态规划,我们在深度遍历的过程中,对于某一个子树,求出左右子树叶子节点到根节点的最大距离,进而求出经过根节点的最大距离. 最后求出所有子树经过根节点的最大距离.就是这个题目的最终结果.代码如下: //二叉树的建立,以及遍历 //16 14 8 2 -1 -1 4 -1 -1 7 1 -1 -1 -1 10 9 -1 -1 3 -1 -1 //16 14 8 2 -1 -1 4 -1 -1 7

二叉树基本操作--创建,三种遍历,叶子节点

虽然二叉树的操作很常见,但是认真写写熟悉很重要,特别是typedef, CreateBiTree(BiTNode** T)指针的操作等等,还有就是创建方法,去实际输入值就知道其中的妙处,为-1时为空节点. #include <iostream> using namespace std; //节点的定义 typedef struct BTNode { int data; BTNode* rChild; BTNode* lChild; }BiTNode, *BiTree; //二叉树的创建,先序创

二叉树的层次遍历和(叶子)节点

#include<stdio.h> #include<string.h> #include<stdlib.h> #define size 100 #define resize 10 typedef struct Bitnode{ //定义结点 char data; struct Bitnode *lchild,*rchild; }Bitnode,*Bitree; typedef struct { //定义队列 Bitree *base; int front; int r

UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后输出来叶子节点. 一开始写的时候是用gets读入的,报CE, 要用fgets写,关于fgets(),传送门: fgets函数及其用法,C语言fgets函数详解 一开始用bfs过的,后来发现,好多人都是dfs过的,又写了一下dfs... 代码: 1 //二叉树的中序和后序遍历还原树并输出最短路径的叶子

二叉树的三种遍历的应用(表达式,求深度,叶子数,结点数,二叉树的建立,复制)

表达式的表示 如图所示的二叉树表达式: a+b*(c-d)-e/f 若先序遍历此二叉树,按访问结点的先后次序将结点排列起来,其先序序列为: (波兰式,前缀表达式)  -+a*b-cd/ef 按中序遍历,其中序序列为:a+b*c-d-e/f (中缀表达式) 按后序遍历,其后序序列为:abcd-*+ef/- (逆波兰式,后缀表达式) 注:人喜欢中缀形式的算术表达式,对于计算机,使用后缀易于求值 查询二叉树中某个结点 使用先序遍历算法进行查询遍历 // 若二叉树中存在和 x 相同的元素,则 p 指向该