1
完全二叉树的顺序存储
#include<iostream.h>
#include<string.h>
class treenode { public:
char data; int left, right, parent;
treenode(){left=right=parent=-1;} };
int n; //全局变量
void creattree(char a[],treenode t[]) //建二叉树
{ for(int i=0;a[i]!='\0';i++)
{ t[i].data=a[i]; if(2*i+1<n) t[i].left=2*i+1; if(2*i+2<n) t[i].right=2*i+2; if(i!=0) t[i].parent=(i-1)/2; } } void searchchild(char x,treenode t[]) //寻找子节点 { for(int i=0;i<n;i++) if(t[i].data==x)
{ if(t[i].left==-1 && t[i].right==-1) //专对根节点的处理 cout<<x<<"无子节点"<<'\n'; else { if(t[i].left!=-1) cout<<x<<"的左子节点为:"<<t[t[i].left].data<<'\n'; f(t[i].right!=-1) cout<<x<<"的右子节点为:"<<t[t[i].right].data<<'\n'; if(t[i].left!=-1&&t[i].right==-1) cout<<x<<"无右子节点"<<endl; } break; } }
void searchparent(char x,treenode t[]) //寻找父节点 { for(int i=0;i<n;i++) if(t[i].data==x) { if(t[i].parent!=-1) cout<<x<<"的父节点为:"<<t[t[i].parent].data<<'\n'; else cout<<x<<"无父节点"<<'\n'; break; }
if(i>=n) cout<<"该树中无"<<x<<"此节点!"<<'\n'; } void searchbrother(char x,treenode t[]) //寻找兄弟节点 { for(int i=0;i<n;i++) if(t[i].data==x) { if(i==0) cout<<x<<"无兄弟"<<'\n'; //专对根节点的处理 else { if(i%2==0) cout<<x<<"的左兄弟为:"<<t[i-1].data<<'\n';
if(i%2!=0 && i+1<n)
cout<<x<<"的右兄弟为:"<<t[i+1].data<<'\n';
a[] left data right parent
0 1 A 2 -1
1 3 B 4 0
2 5 C 6 0
3 7 D -1 1
4 -1 E -1 1
5 -1 F -1 2
6 -1 G -1 2
7 -1 H -1 3
2
if(i%2==0 && i+1==n) //专对最后只有左节点的处理
cout<<x<<"无右兄弟"<<'\n'; } break; } }
void preorder(int r,treenode t[]) //前序遍历 { if(r<n) { cout<<t[r].data<<'\t'; preorder(2*r+1,t); preorder(2*r+2,t); } } void postorder(int r,treenode t[])//后序遍历 { if(r<n) { postorder(2*r+1,t); postorder(2*r+2,t); cout<<t[r].data<<'\t'; } } void main() { char a[20]; char x;
cout<<"请连续输入构成完全二叉树的各节点:"; cin>>a;
int size=strlen(a);n=size; //计算字符串的长度,赋值给全局变量n 。
treenode t[10]; //要输入的字符数需小于等于10 cout<<"请输入要查找的字符:"; cin>>x; creattree(a,t); int r=0; //从第一个节点开始遍历
cout<<'\n'<<"前序遍历结果为:"; preorder(r,t); cout<<'\n'; cout<<"中序遍历结果为:"; inorder(r,t); cout<<'\n'; cout<<"后序遍历结果为:"; postorder(r,t); cout<<'\n'; cout<<'\n'; searchchild(x,t); searchparent(x,t); searchbrother(x,t); }
结果如下:
void inorder(int r,treenode t[]) { if(r<n) { inorder(2*r+1,t); cout<<t[r].data<<'\t'; inorder(2*r+2,t); } } //中序遍历 请连续输入构成完全二叉树的各节点:ABCDEFGH 请输入要查找的字符:A
前序遍历结果为:A B D H E C F G 中序遍历结果为:H D B E A F C G 后序遍历结果为:H D E B F G C A
A 的左子节点为:
B A 的右子节点为:
C A 无父节点 A 无兄弟
请连续输入构成完全二叉树的各节点:ABCDEFGH 请输入要查找的字符:B
前序遍历结果为:A B D H E C F G 中序遍历结果为:H D B E A F C G 后序遍历结果为:H D E B F G C A
B 的左子节点为:D B 的右子兄弟为:E B 的父节点为:A B 的右兄弟为:C
A / \
B
C / \ / \
D
E
F
G / H
A / \
B C
/ \ / \ D E F G /
H。