/*
使用两个数组存储一个结点的左孩子和右孩子(数字存储,0表示空),判断结点u是否为结点v的子孙
思路:
将结点v的非空子结点全部入队 ,判断是否有结点u
输入
深度为3的满二叉树:
7
2 3
4 5
6 7
0 0
0 0
0 0
0 0
uv值:1 2; 2 1; 1 1 ; 0 0 ;6 2;6 3
*/
#include <iostream>
using namespace std;
const int maxsize = 100;
bool f(int L[], int R[], int n, int u, int v){
if(u<=v)
return false;
int queue[maxsize];
int f=0, r=0;
queue[r++] = v;
while(true){
//队空
if(r==f)
break;
int t = queue[f];
f = (f+1)%maxsize;
//找到了
if(L[t]==u || R[t]==u)
return true;
//没有左右结点,即叶子结点
else if(L[t]==0 && R[t]==0)
continue;
else{
if(L[t]!=0){
queue[r] = L[t];
r = (r+1)%maxsize;
}
if(R[t]!=0){
queue[r] = R[t];
r = (r+1)%maxsize;
}
}
}
return false;
}
int main(){
int n;
int i;
int u, v;
int L[maxsize], R[maxsize];
cout << "输入顺序结构的长度:";
cin >> n;
for(i=1; i<=n; i++)
cin >> L[i] >> R[i];
cout << "输入结点u、v:";
cin >> u >> v;
cout << f(L, R, n, u, v) << endl;
return 0;
}
判断顺序存储的二叉树中u结点是否是v结点的子孙结点(已知孩子结点)
最新推荐文章于 2021-02-23 20:43:43 发布