二叉树中两个子节点的最近公共节点

求二叉树中两个子节点的最近公共节点

// 树节点
struct node
{
	struct node* left;
	struct node* right;
	int val;
	node(int t=0)
	{
		val = t;
		left = 0;
		right = 0;
	}
};

typedef struct node* link;

// 构造树
void insert_tree(link &h, int t)
{
	if (0 == h)
	{
		h = new node(t);
		return;
	}

	if (t < h->val) insert_tree(h->left, t);
	else insert_tree(h->right, t);
}

// 找最近公共节点,保存在ans中
bool descend(link &root, link &pre, link &ans, int v1, int v2)
{
	if (root == 0) return false;
	bool mid = (root->val == v1) || (root->val == v2);
	bool left = descend(root->left, root, ans, v1, v2);
	bool right = descend(root->right, root, ans, v1, v2);

	if (mid && (left || right)) ans = pre;
	else if (left && right) ans = root;

	return mid || left || right;
}

int _tmain(int argc, _TCHAR* argv[])
{
	link h = 0;
	link pre=0, ans=0;
	insert_tree(h, 5);
	insert_tree(h, 4);
	insert_tree(h, 6);
	insert_tree(h, 3);
	insert_tree(h, 7);
	insert_tree(h, 8);
	descend(h, pre, ans, 7, 8);

	if (ans !=0)
		cout<< ans->val <<endl;
	else 
		cout<< "no"<<endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值