数据结构之链表二叉树实现
代码及思想
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef char ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void InitBiTree(BiTree &T);
void CreateBiTree(BiTree &T);
bool BiTreeEmpty(BiTree &T);
int BiTreeDepth1(BiTree &T);
int BiTreeDepth2(BiTree &T);
void Visit(ElemType e);
void PreOrderTraverse(BiTree &T);
void InOrderTraverse(BiTree &T);
void PostOrderTraverse(BiTree &T);
int CountLeaf1(BiTree &T,int &count1);
int CountLeaf2(BiTree &T);
int CountNode(BiTree T);
int max(int a,int b);
ElemType Parent(BiTree &T,ElemType e);
BiTree FindNode(BiTree &T,ElemType e);
void LeftSibling(BiTree &T,ElemType e);
void RightSibling(BiTree &T,ElemType e);
Status levelTraverse(BiTree T);
Status preOrderTraverseEX(BiTree T);
Status InOrderTraverseEX(BiTree T);
Status PostOrderTraverseEX(BiTree T);
Status DestroyBiTree(BiTree T);
Status ExchangeBiTree(BiTree &T);
Status DeleteChild(BiTree &T,ElemType x);
void InitBiTree(BiTree &T)
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T -> lchild = NULL;
T -> rchild = NULL;
}
void CreateBiTree(BiTree &T)
{
ElemType ch;
scanf("%c",&ch);
if(ch == '#')
T = NULL;
else
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
bool BiTreeEmpty(BiTree &T)
{
if(T)
return false;
return true;
}
int BiTreeDepth1(BiTree &T)
{
int lDepth,rDepth;
if(BiTreeEmpty(T))
return ERROR;
if(T->lchild)
lDepth = BiTreeDepth1(T->lchild);
else
lDepth = 0;
if(T->rchild)
rDepth = BiTreeDepth1(T->rchild);
else
rDepth = 0;
return lDepth > rDepth ? lDepth+1 : rDepth+1;
}
int BiTreeDepth2(BiTree &T)
{
int lDepth,rDepth;
if(T == NULL)
return 0;
else
return max(BiTreeDepth2(T->lchild),BiTreeDepth2(T->rchild))+1;
}
void Visit(ElemType e)
{
cout<<e<<" ";
}
void PreOrderTraverse(BiTree &T)
{
if(T)
{
Visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree &T)
{
if(T)
{
InOrderTraverse(T->lchild);
Visit(T->data);
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree &T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
Visit(T->data);
}
}
int CountLeaf1(BiTree &T,int &count1)
{
if(T)
{
if((T->lchild == NULL) && (T->rchild == NULL))
{
count1++;
}
CountLeaf1(T->lchild,count1);
CountLeaf1(T->rchild,count1);
}
return count1;
}
int CountLeaf2(BiTree &T)
{
if(T == NULL)
return 0;
if(T->lchild == NULL && T->rchild == NULL)
return 1;
else
{
return CountLeaf2(T->lchild)+CountLeaf2(T->rchild);
}
}
int CountNode(BiTree T)
{
if(T == NULL)
return 0;
return CountNode(T->lchild)+CountNode(T->rchild)+1;
}
int max(int a,int b)
{
return a > b ? a : b;
}
ElemType Parent(BiTree &T,ElemType e)
{
if(T)
{
if( T->lchild && (T->lchild->data == e) || T->rchild && (T->rchild->data == e) )
return T->data;
else
{
Parent(T->lchild,e);
Parent(T->rchild,e);
}
}
return ' ';
}
BiTree FindNode(BiTree &T,ElemType e)
{
if(T == NULL)
return NULL;
if(T->data == e)
return T;
BiTree node = FindNode(T->lchild,e);
if(node != NULL)
return node;
else
return FindNode(T->rchild,e);
}
void LeftSibling(BiTree &T,ElemType e)
{
ElemType ch = Parent(T,e);
BiTree temp = FindNode(T,ch);
if(temp->lchild != NULL)
{
if(temp->lchild->data != e)
{
cout<<"此节点的左兄弟为:"<<temp->lchild->data<<endl;
}
else
{
cout<<"此节点没有左兄弟"<<endl;
}
}
}
void RightSibling(BiTree &T,ElemType e)
{
ElemType ch = Parent(T,e);
BiTree temp = FindNode(T,ch);
if(temp->rchild != NULL)
{
if(temp->rchild->data != e)
{
cout<<"此节点的右兄弟为:"<<temp->rchild->data<<endl;
}
else
{
cout<<"此节点没有右兄弟"<<endl;
}
}
}
typedef struct
{
ElemType data[100];
int front,rear;
int length;
}Tqueue;
Status levelTraverse(BiTree T)
{
BiTree Tqueue[100];
BiTNode *p = NULL;
int front=0,rear=0;
if(T)
{
rear = (rear + 1) % 100;
Tqueue[rear] = T;
printf("%c",p->data);
if(p->lchild)
{
rear = (rear + 1)%100;
Tqueue[rear] = p->lchild;
}
if(p->rchild)
{
rear = (rear + 1) % 100;
Tqueue[rear] = p->rchild;
}
}
return 1;
}
Status preOrderTraverseEX(BiTree T)
{
BiTree arr[100];
BiTNode *temp = NULL;
int len = 0;
if(T)
{
arr[len] = T;
len++;
while(len != 0)
{
temp = arr[len - 1];
while(temp)
{
printf("%c\n",temp->data);
arr[len] = temp->lchild;
len++;
temp = arr[len-1];
}
temp = arr[len-1];
len--;
if(len != 0)
{
temp = arr[len - 1];
len--;
arr[len] = temp->rchild;
len++;
}
}
return 1;
}
return 0;
}
Status InOrderTraverseEX(BiTree T)
{
BiTree arr[100];
BiTNode* temp = NULL;
int len = 0;
if (T)
{
arr[len] = T;
len++;
while (len!=0)
{
temp = arr[len - 1];
while (temp)
{
arr[len] = temp->lchild;
len++;
temp = arr[len - 1];
}
temp = arr[len - 1];
len--;
if (len!=0)
{
temp = arr[len - 1];
len--;
printf("%c\n", temp->data);
arr[len] = temp->rchild;
len++;
}
}
return 1;
}
return 0;
}
Status PostOrderTraverseEX(BiTree T)
{
BiTree arr[100];
BiTNode* pre = NULL,* temp = T;
int len = 0;
if (temp)
{
while (temp || !(len == 0))
{
while (temp)
{
arr[len] = temp;
len++;
temp = temp->lchild;
}
if (!(len == 0))
{
temp = arr[len - 1];
if (temp->rchild != NULL && temp->rchild != pre)
{
arr[len] = temp;
temp = temp->rchild;
}
else
{
printf("%c\n", temp->data);
pre = temp;
temp = NULL;
}
}
}
return 1;
}
return 0;
}
Status DestroyBiTree(BiTree T)
{
BiTNode *TL = NULL,*TR = NULL;
if(T == NULL)
return 0;
TL = T->lchild;
TR = T->rchild;
T->lchild = NULL;
T->rchild = NULL;
free(T);
T = NULL;
DestroyBiTree(TL);
DestroyBiTree(TR);
return OK;
}
Status ExchangeBiTree(BiTree &T){
BiTNode * temp;
if(T){
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
ExchangeBiTree(T->lchild);
ExchangeBiTree(T->rchild);
}
return OK;
}
int main()
{
BiTree T;
char B='b',C='c';
int count1=0,count2=0;
InitBiTree(T);
cout<<"请输入二叉树初始化数据,'#'为空结点"<<endl;
CreateBiTree(T);
cout<<"*前序遍历为:"<<endl;
PreOrderTraverse(T);
cout<<endl;
cout<<"*中序遍历为:"<<endl;
InOrderTraverse(T);
cout<<endl;
cout<<"*后序遍历为:"<<endl;
PostOrderTraverse(T);
cout<<endl;
cout<<"#树的高度为(法一、法二):"<<BiTreeDepth1(T)<<" "<<BiTreeDepth2(T)<<endl;
cout<<"#树的叶子结点个数为(法一、法二):"<<CountLeaf1(T,count1)<<" "<<CountLeaf2(T)<<endl;
cout<<"#树的结点个数为:"<<CountNode(T)<<endl;
cout<<"#元素'b'的父亲结点为:"<<Parent(T,B)<<endl;
cout<<"#元素'b'的右兄弟结点为:"<<endl;
RightSibling(T,B);
cout<<"#元素'c'的左兄弟结点为:"<<endl;
LeftSibling(T,C);
cout<<"#元素'c'的右兄弟结点为:"<<endl;
RightSibling(T,C);
DestroyBiTree(T);
return 0;
}
测试截图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190713191726105.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0NzY3Nzg0,size_16,color_FFFFFF,t_70)