遍历二叉树
统计二叉树结点数、叶子数、深
度。
#include<iostream>
#include<bits/stdc++.h>#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct BiTNode{
int data;
int flag;
struct BiTNode *Lchild,*Rchild;
}BTNode,BTree;
BTNode* CreateBitTree(int tdata[], int num);
BTNode* InsertBST(BTNode *T, int key);
void PreOrderTraverse(BTNode* tnode, void(*Visit)(BTNode* tnode));
void MidOrderTraverse(BTNode* tnode, void(*Visit)(BTNode* tnode));
void PostOrderTraverse(BTNode* tnode, void(*Visit)(BTNode* tnode));
void PrintData(BTNode* tnode);
int depth(BTNode* t);
int num_of_nodes(BTNode* t);
int leaf_of_nodes(BTNode* t);
int main()
{
BTNode* tree = nullptr;
int a[10] = {2, 1, 3, 4, 6, 5, 8, 7, 10, 9};
for(int i = 0; i < 10; i++){
tree = InsertBST(tree,a[i]);
}
cout<<"PreOrderTraverse"<<endl;
PreOrderTraverse(tree, PrintData);
cout<<"MidOrderTraverse"<<endl;
MidOrderTraverse(tree, PrintData);
cout<<"PostOrderTraverse"<<endl;
PostOrderTraverse(tree, PrintData);
cout<<"深度为"<<depth(tree)<<endl;
cout<<"结点数为"<<num_of_nodes(tree)<<endl;
cout<<"叶结点数为"<<leaf_of_nodes(tree)<<endl;
return 0;
}
BTNode* CreateBitTree(int tdata[], int num)
{
BTNode* tnode;
if(num!=0)
{
tnode = (BTNode*)malloc(sizeof(BTNode));
if(tnode == nullptr)
{
return nullptr;
}
tnode->data = tdata[num-1];
tnode->Lchild = CreateBitTree(tdata, num-1);
tnode->Rchild = CreateBitTree(tdata, num-1);
return tnode;
}
else
{
return nullptr;
}
}
BTNode* InsertBST(BTNode *T, int key){
BTNode *f = T, *p = T;
while(p){
if(p->data == key) return T;
f = p;
p = (key<p->data) ? p->Lchild : p->Rchild;
}
p = (BTNode*)malloc(sizeof(BTNode));
p->data = key;
p->Lchild = p->Rchild = NULL;
if(T == NULL) T = p;
else if (key<f->data) f->Lchild = p;
else f->Rchild = p;
return T;
}
void PreOrderTraverse(BTNode* tnode, void(*Visit)(BTNode* tnode))
{
if(tnode != nullptr)
{
Visit(tnode);
PreOrderTraverse(tnode->Lchild,Visit);
PreOrderTraverse(tnode->Rchild,Visit);
}
}
void MidOrderTraverse(BTNode* tnode, void(*Visit)(BTNode* tnode))
{
if(tnode != nullptr)
{
MidOrderTraverse(tnode->Lchild,Visit);
Visit(tnode);
MidOrderTraverse(tnode->Rchild,Visit);
}
}
void PostOrderTraverse(BTNode* tnode, void(*Visit)(BTNode* tnode))
{
if(tnode != nullptr)
{
PostOrderTraverse(tnode->Lchild,Visit);
PostOrderTraverse(tnode->Rchild,Visit);
Visit(tnode);
}
}
void PrintData(BTNode* tnode)
{
cout<<tnode->data<<endl;
}
int depth(BTNode* t)
{
if(t == NULL) return 0;
int dl = depth(t->Lchild);
int dr = depth(t->Rchild);
return (dl>dr ? dl : dr) + 1;
}
int num_of_nodes(BTNode* t)
{
if(t == NULL) return 0;
return 1 + num_of_nodes(t->Lchild) + num_of_nodes(t->Rchild);
}
int leaf_of_nodes(BTNode* t)
{
if(t == NULL) return 0;
if(t->Lchild == NULL && t->Rchild == NULL) return 1;
return leaf_of_nodes(t->Lchild) + leaf_of_nodes(t->Rchild);
}