通过两个和二叉树相关的算法题来看看和递归在二叉树中的应用
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
思路: 如果这两个节点不在同一个子树下面,那么这棵树的根节点就是他们的共同最低父节点。
如果两个都在右子树,那么以右子树的最上面的那个节点作为根节点,重新进行判断,递归调用。
同理两个都在左子树,则方法同上。 也就是说,最终的结果分别只有三种情况,一个节点在右子树,一个节点在左子树。两个节点都在右子树,两个节点都在左子树。
如果是第一种情况,那么当前的节点就是他们最低的公共节点,左右都在左子树,或者在右子树,那么就递归调用。
BinTree* GetParent(BinTree* root,BinTree* first,BinTree* second)
{
if(root == NULL)
return ;
if(root == first || second == second)
{
return root;
}
BinTree* Low_left = GetParent(root->left,first,second);
BinTree* Low_right = GetParent(root->right,first,second);
/*说明在左子树中没有找到和first/second中任何一个相同的节点 公共父节点右子树 而且第一个就是*/
if(Low_left == NULL)
return Low_right;
/*在右子树中没有找到和first/second中任何一个相同的节点 公共父节点在左子树 而且第一个就是最低父节点*/
else if(Low_right == NULL)
return Low_left;
else
return root;
}
在左子树中没找到任何一个节点,那么就在右子树中找,在右子树中没找到任何一个节点,那么共同父节点肯定在左子树。如果在左右子树中各找到一个节点(注意并不可能同时找到两个节点的),那么当前节点就是最低共同父节点。
递归解法效率很低,有很多重复的遍历,下面看一下非递归解法。
非递归解法:
先求从根节点到两个节点的路径,然后再比较对应路径的节点就行,最后一个相同的节点也就是他们在二叉树中的最低公共祖先节点
参考代码如下:
bool GetNodePath(BinaryTreeNode * pRoot, BinaryTreeNode * pNode,
list<BinaryTreeNode *> & path)
{
if(pRoot == pNode)
{
path.push_back(pRoot);
return