二叉树常见面试题

(一)求二叉树和为某一值的路径

//二叉树中和为某一值的路径44
void findpath(BstNode* ptr,int sum,int& cur,vector<BstNode*> &vec)
{
	cur += ptr->data;
	vec.push_back(ptr);

	//如果当前节点为叶子节点并且cur == sum  满足要求 打印vector中的节点
	if(ptr->leftchild == NULL && ptr->rightchild == NULL && cur == sum)
	{
		cout<<"二叉树中和为"<<sum<<"的路径为::";
		vector<BstNode*>::iterator it = vec.begin();
		while(it != vec.end())
		{
			cout<<(*it)->data<<" ";
			++it;
		}
		cout<<endl;
	}

	//如果当前节点有左孩子 那么继续判断左孩子
	if(ptr->leftchild != NULL)
		findpath(ptr->leftchild,sum,cur,vec);
	//如果当前节点有右孩子 那么继续判断右孩子
	if(ptr->rightchild != NULL)
		findpath(ptr->rightchild,sum,cur,vec);

	//如果当前节点为叶子节点 但是 cur!=num 那么回退到上一层 并且cur减去当前节点值
	//vector中删除此节点
	cur -= ptr->data;
	vec.pop_back();
}
void Find_Path(BstNode* ptr,int sum)
{
	if(ptr == NULL)
		return ;
	int cur = 0;//用来标记所经过的节点到当前节点的和
	vector<BstNode*> vec;//记录经过的路径
	findpath(ptr,sum,cur,vec);
}

(二)判断一个数组是否为搜索二叉树的后序遍历

//判断一个数组是否是二叉搜索树的后序遍历
bool Is_LastOrder( ElemType *arr,int len)
{
	if(arr == NULL || len < 0)
		return false;
	//最后一个元素为根节点
	ElemType root = arr[len -1];
	int i = 0;
	//从头遍历找第一个比root节点大的值 确定根节点的左节点范围
	for( ;i < len-1 ;++i)
	{
		if(arr[i] > root)
		{
			break;
		}
	}

	//在根节点右边如果有存在小于根节点的值  那么就不是二叉搜索树
	for(int j = i ;j < len -1 ;++j)
	{
		if(arr[j] < root)
			return false;
	}

	//经过前两个循环后 第一次左右划分正确 在判断左右孩子是否为二叉搜索树
	bool left = true;
	if(i > 0)
		left = Is_LastOrder(arr,i);
	bool right = true;
	if(i < len -1)
		right = Is_LastOrder(arr+i,len - i -1);

	//只有都比较完之后 left 和right  都为真时  才真的是二叉搜索树的后序遍历
	return (left && right);
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值