求二叉树的最低公共祖先

这个题目来讲,应该是在二叉树里面较为容易的题目了。那么如何下手呢?其实对于这样一棵二叉树来讲。

我们如何求它们的最低公共父节点呢?
假如是要你求5、6的公共父节点,那么是3.啰
为什么是3?
因为3的左子树是5,而右子树是6啰。
那么7、8的最低公共祖先呢?
1啊,因为1的左子树中有7、而1的右子树中有8啊。
那么思路来了。我们只要证明某一节点的左子树和右子树分别包含这两个节点就行了。
于是思路来了。
注意:在本题中为了方便 ,我们传入的两个节点的值,而不是两个节的地址,呵呵,为了方便 嘛。
#ifndef THELAST_COM_PARENT_H#define THELAST_COM_PARENT_H#include"reconstructBinaryTree.h"bool isInsubTree(TreeNode *node,int n_val);TreeNode *lastestCommParent(TreeNode *root,int n_val1 ,int n_val2){if(root==NULL){return NULL;}if(isInsubTree(root->left,n_val1)&&isInsubTree(root->right,n_val2)){return root;}if(isInsubTree(root->left,n_val2)&&isInsubTree(root->right,n_val1)){return root;}if(isInsubTree(root->left,n_val1)&&isInsubTree(root->left,n_val2)){return lastestCommParent(root->left,n_val1,n_val2);}if(isInsubTree(root->right,n_val1)&&isInsubTree(root->right,n_val2)){return lastestCommParent(root->right,n_val1,n_val2);}}bool isInsubTree(TreeNode *node,int n_val){if(node==NULL){return false;}if(node->val==n_val){return true;}return isInsubTree(node->left,n_val)||isInsubTree(node->right,n_val);}#endif
bool isInsubTree(TreeNode *node,int n_val)这个函数的目的是确定n_val有没有在以node为根的子树中,如果在返回为true,否则返回false.
//如果n_val1和n_val2分别在左右子树中,那正好。if(isInsubTree(root->left,n_val1)&&isInsubTree(root->right,n_val2)){return root;}if(isInsubTree(root->left,n_val2)&&isInsubTree(root->right,n_val1)){return root;}//如果两个节点都在左子树中,那么往左树中走if(isInsubTree(root->left,n_val1)&&isInsubTree(root->left,n_val2)){return lastestCommParent(root->left,n_val1,n_val2);}//如果两个节点都在右子树中,那么往右子树走if(isInsubTree(root->right,n_val1)&&isInsubTree(root->right,n_val2)){return lastestCommParent(root->right,n_val1,n_val2);}
主要分析下这部分代码:
我以前也是很少关注递归的返回值的问题,我觉得这个人写得还可以,至少给我说明了这个递归返回值给程序结果带来的影响:
bool isInsubTree(TreeNode *node,int n_val){if(node==NULL){return false;}if(node->val==n_val){return true;}//这里只能这么写,因为我们只要出现一个true只写了啊,也就是这个节点只要出现一次就OK了,于是用“或”//要认真考虑递归的返回值,确保下一给的结果能反馈给上一给的程序,这样一级级从上往上返回,直到第一级//第一级也就是直接影响我们整个程序返回值的。return isInsubTree(node->left,n_val)||isInsubTree(node->right,n_val);}
浙公网安备 33010602011771号