1.二叉树的创建与输出
#include<iostream>
//#include<cstdio>
//#include<cstdlib>
using namespace std;
struct node
{
char data;
struct node *lchild;
struct node *rchild;
};
typedef struct node BTnode;
typedef struct node* tree;
tree root;//定义一棵树
//二叉树的创建 ,输入样例:ABC###D##
void creat(tree &bt)
{
char ch;
ch=getchar();
if(ch!='#')
{
bt=new node;
bt->data=ch;
creat(bt->lchild);
creat(bt->rchild);
}
else bt=NULL;
}
//先序输出:ABCD
void DLR(tree bt)
{
if(bt==NULL) return;
else
{
cout<<bt->data;
DLR(bt->lchild);
DLR(bt->rchild);
}
}
//中序遍历:CBAD
void LDR(tree bt)
{
if(bt==NULL) return;
else
{
LDR(bt->lchild);
cout<<bt->data;
LDR(bt->rchild);
}
}
//后序遍历:CBDA
void LRD(tree bt)
{
if(bt==NULL) return;
else
{
LRD(bt->lchild);
LRD(bt->rchild);
cout<<bt->data;
}
}
int main()
{
creat(root);
DLR(root);
cout<<endl;
LDR(root);
cout<<endl;
LRD(root);
return 0;
}
2.求二叉树结点的个数
//求二叉树root的结点个数
int BTNodeSize(tree bt)
{
if(bt==NULL) return 0;
return BTNodeSize(bt->lchild)+BTNodeSize(bt->rchild)+1;
}
3.求二叉树叶子结点个数
//求二叉树叶子结点个数
int BTNodeLeaf(tree bt)
{
if(bt==NULL) return 0;
if(bt->lchild==NULL&&bt->rchild==NULL)
return 1;
return BTNodeLeaf(bt->lchild)+BTNodeLeaf(bt->rchild);
}
4.求二叉树的深度
//求二叉树的深度
int BTDepth(tree bt)
{
if(bt==NULL) return 0;
int left=BTDepth(bt->lchild);
int right=BTDepth(bt->rchild);
return (left>right)?(left+1):(right+1);
}
5. 判断一个结点是否在二叉树中
//判断一个结点是否在二叉树中
tree BTFind(tree bt,char x)
{
tree ret;
if(bt==NULL||bt->data==x)
return bt;
ret=bt->lchild;
if(ret) return ret;
ret=bt->rchild;
if(ret) return ret;
return NULL;
}
6.求K层结点的个数
//求K层结点的个数
int BTNodeKlevel(tree bt,int k)
{
if(bt==NULL) return 0;
if(k==1) return 1;
return BTNodeKlevel(bt->lchild,k-1)+BTNodeKlevel(bt->rchild,k-1);
}
7.获取一个结点的左孩子结点
//获取一个结点的左孩子结点
tree GetBTNodeLeftChild(tree bt,char x)
{
tree ret =NULL;
if(root==NULL) return NULL;
ret=BTFind(bt,x);
if(ret==NULL) return NULL;
if(ret->lchild)
return ret->lchild;
else return NULL;
}
8. 获取一个结点的右孩子结点
//获取一个结点的右孩子结点
tree GetBTNodeRightChild(tree bt,char x)
{
tree ret =NULL;
if(bt==NULL) return NULL;
ret=BTFind(bt,x);
if(ret==NULL) return NULL;
if(ret->lchild)
return ret->rchild ;
else return NULL;
}
9.在排序二叉树找一棵树,返回节点
//在排序二叉树找一棵树,返回节点
tree findn(tree bt,char n)
{
//排序二叉树中节点左侧都小于该结点
if(bt==NULL) return NULL;
if(n<bt->data) findn(bt->lchild,n);
else if(n>bt->data) findn(bt->rchild,n);
else return bt;
}
10. 层序遍历
void BTLevelSearch(tree bt)
{
queue<tree>q;
if(bt==NULL) return;
q.push(bt);
while(!q.empty())
{
tree f=q.front();
cout<<f->data;
q.pop();
//将他的两个孩子入队
if(f->lchild)
{
q.push(f->lchild);
}
if(f->rchild)
{
q.push(f->rchild);
}
}
cout<<endl;
}
11. 判断一棵树是否为完全二叉树
//判断一棵树是否为完全二叉树
bool BTComplete(tree bt)
{
queue<tree>q;
if(bt==NULL) return true;
q.push(bt);
while(!q.empty())
{
tree f=q.front();
if(f==NULL)
{
while(!q.empty())
{
if(q.front())
{
return false;
}
q.pop();
}
return true;
}
else
{
q.push(f->lchild);
q.push(f->rchild);
}
q.pop();
}
}
12. 二叉树某结点的层数
//二叉树某结点的层数
void getNodeLayer(tree bt,char x,int layer)
{
if(bt==NULL) return;
if(bt->data==x)
{
cout<<layer<<endl;
return;
}
getNodeLayer(bt->lchild,x,layer+1);
getNodeLayer(bt->rchild,x,layer+1);
}
总代码:
#include<iostream>
#include<queue>
//#include<cstdio>
//#include<cstdlib>
using namespace std;
struct node
{
char data;
struct node *lchild;
struct node *rchild;
};
typedef struct node BTnode;
typedef struct node* tree;
tree root;//定义一棵树
//二叉树的创建 ,输入样例:ABC###D##
void creat(tree &bt)
{
char ch;
ch=getchar();
if(ch!='#')
{
bt=new node;
bt->data=ch;
creat(bt->lchild);
creat(bt->rchild);
}
else bt=NULL;
}
//先序输出:ABCD
void DLR(tree bt)
{
if(bt==NULL) return;
else
{
cout<<bt->data;
DLR(bt->lchild);
DLR(bt->rchild);
}
}
//中序遍历:CBAD
void LDR(tree bt)
{
if(bt==NULL) return;
else
{
LDR(bt->lchild);
cout<<bt->data;
LDR(bt->rchild);
}
}
//后序遍历:CBDA
void LRD(tree bt)
{
if(bt==NULL) return;
else
{
LRD(bt->lchild);
LRD(bt->rchild);
cout<<bt->data;
}
}
//求二叉树root的结点个数
int BTNodeSize(tree bt)
{
if(bt==NULL) return 0;
return BTNodeSize(bt->lchild)+BTNodeSize(bt->rchild)+1;
}
//求二叉树叶子结点个数
int BTNodeLeaf(tree bt)
{
if(bt==NULL) return 0;
if(bt->lchild==NULL&&bt->rchild==NULL)
return 1;
return BTNodeLeaf(bt->lchild)+BTNodeLeaf(bt->rchild);
}
//求二叉树的深度
int BTDepth(tree bt)
{
if(bt==NULL) return 0;
int left=BTDepth(bt->lchild);
int right=BTDepth(bt->rchild);
return (left>right)?(left+1):(right+1);
}
//判断一个结点是否在二叉树中
tree BTFind(tree bt,char x)
{
tree ret;
if(bt==NULL||bt->data==x)
return bt;
ret=bt->lchild;
if(ret) return ret;
ret=bt->rchild;
if(ret) return ret;
return NULL;
}
//求K层结点的个数
int BTNodeKlevel(tree bt,int k)
{
if(bt==NULL) return 0;
if(k==1) return 1;
return BTNodeKlevel(bt->lchild,k-1)+BTNodeKlevel(bt->rchild,k-1);
}
//获取一个结点的左孩子结点
tree GetBTNodeLeftChild(tree bt,char x)
{
tree ret =NULL;
if(root==NULL) return NULL;
ret=BTFind(bt,x);
if(ret==NULL) return NULL;
if(ret->lchild)
return ret->lchild;
else return NULL;
}
//获取一个结点的右孩子结点
tree GetBTNodeRightChild(tree bt,char x)
{
tree ret =NULL;
if(bt==NULL) return NULL;
ret=BTFind(bt,x);
if(ret==NULL) return NULL;
if(ret->lchild)
return ret->rchild ;
else return NULL;
}
//在排序二叉树找一棵树,返回节点
tree findn(tree bt,char n)
{
//排序二叉树中节点左侧都小于该结点
if(bt==NULL) return NULL;
if(n<bt->data) findn(bt->lchild,n);
else if(n>bt->data) findn(bt->rchild,n);
else return bt;
}
//层序遍历
void BTLevelSearch(tree bt)
{
queue<tree>q;
if(bt==NULL) return;
q.push(bt);
while(!q.empty())
{
tree f=q.front();
cout<<f->data;
q.pop();
//将他的两个孩子入队
if(f->lchild)
{
q.push(f->lchild);
}
if(f->rchild)
{
q.push(f->rchild);
}
}
cout<<endl;
}
//判断一棵树是否为完全二叉树
bool BTComplete(tree bt)
{
queue<tree>q;
if(bt==NULL) return true;
q.push(bt);
while(!q.empty())
{
tree f=q.front();
if(f==NULL)
{
while(!q.empty())
{
if(q.front())
{
return false;
}
q.pop();
}
return true;
}
else
{
q.push(f->lchild);
q.push(f->rchild);
}
q.pop();
}
}
//二叉树某结点的层数
void getNodeLayer(tree bt,char x,int layer)
{
if(bt==NULL) return;
if(bt->data==x)
{
cout<<layer<<endl;
return;
}
getNodeLayer(bt->lchild,x,layer+1);
getNodeLayer(bt->rchild,x,layer+1);
}
int main()
{
creat(root);
DLR(root);
cout<<endl;
LDR(root);
cout<<endl;
LRD(root);
cout<<endl;
//结点个数
cout<<BTNodeSize(root)<<endl;
//叶子结点个数
cout<<BTNodeLeaf(root)<<endl;
//二叉树的深度
cout<<BTDepth(root)<<endl;
// 判断一个结点是否在二叉树中
cout<<"请输入需要判断的结点元素:";
char xx;
cin>>xx;
tree temp;
if(temp=BTFind(root,xx))
{
cout<<"存在该结点:"<<temp->data;
}
else cout<<"不存在";
cout<<endl;
//求K层结点的个数:k=3
cout<<BTNodeKlevel(root,3)<<endl;
//获取某一个结点的左孩子结点
if(temp=GetBTNodeLeftChild(root,'A'))
{
cout<<temp->data ;
}
else cout<<"不存在左孩子结点";
cout<<endl;
//获取某一个结点的右孩子结点
if(temp=GetBTNodeRightChild(root,'A'))
{
cout<<temp->data ;
}
else cout<<"不存在右孩子结点";
cout<<endl;
//排序二叉树找一棵树
if(temp=findn(root,'A'))
{
cout<<"存在";
}
else cout<<"不存在";
cout<<endl;
//层序遍历
BTLevelSearch(root);
//判断一棵树是否为完全二叉树
if(BTComplete(root)) cout<<"是完全二叉树";
else cout<<"不是完全二叉树";
cout<<endl;
//二叉树某结点的层数
getNodeLayer(root,'A',1);
return 0;
}