1. 程式人生 > >二叉樹的創建,先中後序輸出,計算葉子結點數目

二叉樹的創建,先中後序輸出,計算葉子結點數目

技術 traverse 使用遞歸 nod 分享 返回 bsp 否則 %d

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct BiTNode
{
    char data;
    struct BiTNode *l;
    struct BiTNode *r;
} BiTNode,*BiTree;
void CreatBiTree(BiTree &T)
{
    ///按先序次序輸入二叉樹中結點的值(一個字符),創建二叉鏈表表示的二叉樹T;
    char ch;
    scanf(
"%c",&ch); if(ch==#) T=NULL; else { T=new BiTNode; T->data=ch; CreatBiTree(T->l); CreatBiTree(T->r); } } void PreOrderTraverse(BiTree T)///先序遍歷二叉樹 { if(T) { printf("%c",T->data); PreOrderTraverse(T->l); PreOrderTraverse(T
->r); } } void MidOrderTraverse(BiTree T)///中序遍歷二叉樹 { if(T) { MidOrderTraverse(T->l); printf("%c",T->data); MidOrderTraverse(T->r); } } void AfOrderTraverse(BiTree T)///後序遍歷二叉樹 { if(T) { AfOrderTraverse(T->l); AfOrderTraverse(T
->r); printf("%c",T->data); } } int Count(BiTree T){ //計算葉子結點的數目(利用遞歸) if(T== NULL){ return 0; } else if ((T->l==NULL) && (T->r==NULL)){ return 1; } else{ return Count(T->l)+Count(T->r); } } int main() { BiTree T; CreatBiTree(T); printf("先序遍歷為\n"); PreOrderTraverse(T); printf("\n"); printf("中序遍歷為\n"); MidOrderTraverse(T); printf("\n"); printf("後序遍歷為\n"); AfOrderTraverse(T); printf("\n"); printf("輸出葉子結點數:%d\n",Count(T)); return 0; }

技術分享圖片

(首先用#號填充,使二叉樹的葉子結點全部為#)

輸入:AB#CD##E##F#GH###

輸出見下圖:

技術分享圖片

計算二叉樹的所有葉子節點的數量:

當一個節點的左孩子和右孩子都為空時,它是葉子節點。

使用遞歸如果能找到就返回1,如果節點為NULL返回0,否則返回count(t->lchild)+ count(t->rchild)

二叉樹的創建,先中後序輸出,計算葉子結點數目