判断顺序存储的二叉树中u结点是否是v结点的子孙结点(已知孩子结点)

/*
使用两个数组存储一个结点的左孩子和右孩子(数字存储,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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值