資料結構—二叉樹的建立及輸出-遞迴
阿新 • • 發佈:2018-11-25
二叉樹的建立及輸出,問題描述:
(1)前序輸入結點,用”#“表示空指標
(2)前序遍歷二叉樹
(3)中序遍歷二叉樹
(4)後序遍歷二叉樹
(5)求二叉樹的長度
(6)求二叉樹的葉子結點
#include<stdlib.h> #include<stdio.h> #include<iostream> using namespace std; int len=0; typedef struct BiTreenode { char data; struct BiTreenode *lchild, *rchild; }BiTreenode,*BiTreePoint; void CreateTree(BiTreePoint &T)//前序建立二叉樹 { char ch; printf("前序輸入結點:"); cin>>ch;//ch判斷從鍵盤輸入的字元,並將非#的字元存放在T->data中 if (ch == '#')//從鍵盤輸入的是#則T為空樹 T = NULL; if(T)//T非空樹的話,將ch的值存放在data域,對T的左、右子樹進行相同的建立操作 { T=(BiTreePoint)malloc(sizeof(BiTreenode)); T->data=ch;//T的結點 CreateTree(T->lchild);//左子樹 CreateTree(T->rchild); //右子樹 } } void PreOrderTree(BiTreePoint &T)//前序遍歷二叉樹 { if (T)//判斷T是否為空樹,非空則遍歷這棵樹 { printf("%c ", T->data);//主節點 PreOrderTree(T->lchild);//左子樹 PreOrderTree(T->rchild);//右子樹 } } void InOrderTree(BiTreePoint &T)//中序遍歷二叉樹 { if(T) { InOrderTree(T->lchild); cout<<T->data<<' '; InOrderTree(T->rchild); } } void PostOrderTree(BiTreePoint &T)//後序遍歷二叉樹 { if(T) { PostOrderTree(T->lchild); PostOrderTree(T->rchild); cout<<T->data<<' '; } } void LengthTree(BiTreePoint &T) { if(T) { len++; LengthTree(T->lchild); LengthTree(T->rchild); } } void LeavesTree(BiTreePoint &T) { if(T) { if(!T->lchild&&!T->rchild) cout<<T->data<<' '; LeavesTree(T->lchild); LeavesTree(T->rchild); } } void main() { BiTreePoint tree; printf("前序輸入的結點(葉子結點用#表示其左右結點)\n"); CreateTree(tree); cout<<endl; printf("前序遍歷二叉樹的順序:"); PreOrderTree(tree); cout<<endl; cout<<"中序遍歷二叉樹的順序:"; InOrderTree(tree); cout<<endl; cout<<"後序遍歷二叉樹的順序:"; PostOrderTree(tree); cout<<endl; cout<<"所有的葉子結點:"; LeavesTree(tree); cout<<endl; LengthTree(tree); cout<<"二叉樹的長度為:"<<len<<endl; system("pause"); }