最近复习二叉树,简单实现了二叉树的遍历,节点路径,和一些简单操作。
#include<iostream>
#include<vector>
using namespace std;
typedef struct BitNode{
char data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
//先序遍历构造二叉树
void CreateBitTree(BitTree &T){
char ch;
cin>>ch;
if(ch=='#')T=NULL;
else{
T = new BitNode;
T->data=ch;
CreateBitTree(T->lchild);
CreateBitTree(T->rchild);
}
}
//中序遍历二叉树
void FirTraverse(BitTree &T){
if(T){
FirTraverse(T->lchild);
cout<<T->data;
FirTraverse(T->rchild);
}
}
//先序遍历二叉树
void MidTraverse(BitTree &T){
if(T){
cout<<T->data;
MidTraverse(T->lchild);
MidTraverse(T->rchild);
}
}
//后序遍历二叉树
void AftTraverse(BitTree &T){
if(T){
AftTraverse(T->lchild);
AftTraverse(T->rchild);
cout<<T->data;
}
}
//复制二叉树
void copyT(BitTree &T,BitTree &S){
if(T==NULL){
S=NULL;
return;
}else{
S = new BitNode;
S->data=T->data;
copyT(T->lchild,S->lchild);
copyT(T->rchild,S->rchild);
}
}
//计算二叉树深度
int Depth(BitTree &T){
int n,m;
if(T==NULL)return 0;
else{
m=Depth(T->lchild);
n=Depth(T->rchild);
if(m>n)return (m+1);
else return (n+1);
}
}
//统计二叉树中节点个数
int NodeCount(BitTree &T){
if(T==NULL)return 0;
else{
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
}
//求给定结点的路径(value为字符型)
bool FindNode(BitTree &T,char value,vector<char> &v){
if(T==NULL)return false;
v.push_back(T->data);
bool flag = false;
if(T->data==value){
flag=true;
for(int i=0;i<v.size();i++){
cout<<v[i];
if(i!=v.size()-1){
cout<<"->";
}
}
cout<<endl;
}
if(!flag&&T->lchild){
flag=FindNode(T->lchild,value,v);
}
if(!flag&&T->rchild){
flag=FindNode(T->rchild,value,v);
}
v.pop_back();
return flag;
}
int main(){
BitTree T;
CreateBitTree(T);
FirTraverse(T);
cout<<endl;
MidTraverse(T);
cout<<endl;
AftTraverse(T);
cout<<endl;
int a=Depth(T);
cout<<a<<endl;
char temp='C';
vector<char> v;
FindNode(T,temp,v);
return 0;
}
//ABC##DE#G##F###
//1 2 3 # # 4 5 # 6 # # 7 # # #