【转】求二叉树两结点的最近共同父结点

求二叉树两结点的最近共同父结点,在网上看到了一个挺有意思的解法,原文在http://www.cnblogs.com/remlostime/archive/2012/11/26/2788795.html

一般思路是从子节点深度遍历到根节点,然后比较两个路径的分叉点。他用的递归:

 1 struct Node
 2 {
 3     int val;
 4     Node *left;
 5     Node *right;
 6     Node():left(NULL), right(NULL){}
 7 };
 8
 9 Node *findFather(Node *root, Node *node1, Node *node2, bool &node1Find, bool &node2Find)
10 {
11     if (root == NULL)
12         return NULL;
13
14     bool leftNode1Find = false, leftNode2Find = false;
15     Node *leftNode = findFather(root->left, node1, node2, leftNode1Find, leftNode2Find);
16     if (leftNode != NULL)
17         return leftNode;
18
19     bool rightNode1Find = false, rightNode2Find = false;
20     Node *rightNode = findFather(root->right, node1, node2, rightNode1Find, rightNode2Find);
21     if (rightNode != NULL)
22         return rightNode;
23
24     node1Find = leftNode1Find || rightNode1Find;
25     node2Find = leftNode2Find || rightNode2Find;
26
27     if (node1Find && node2Find)
28         return root;
29
30     if (root == node1)
31         node1Find = true;
32
33     if (root == node2)
34         node2Find = true;
35
36     return NULL;
37 }
时间: 2024-08-02 19:33:34

【转】求二叉树两结点的最近共同父结点的相关文章

求解二叉树中两个结点的最低公共父结点

一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点.借用一张图如下: 结点8 和 结点5 的最低公共父结点为 结点2 二,二叉树的构建 与 求二叉树中第K层结点的个数 文章中的第二点:二叉树构建相同 三,求解最低公共父结点的算法实现 有两种思路,一种是通过中序遍历和后序遍历.由于中序遍历是先左子树中的结点,再访问根,再访问右子树中结点,因此这两个结点的公共父结点一定处于这两个结点之间. 如:中序遍历:8, 4, 9, 2, 5, 1, 6, 3, 7  

【编程题目】二叉树两个结点的最低共同父结点

75.二叉树两个结点的最低共同父结点(树)题目:二叉树的结点定义如下:struct TreeNode{int m_nvalue;TreeNode* m_pLeft;TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 思路:修改后序遍历 我的方法需要一个额外的整数n来标定. 开始想用非递归,结果写不出来... 只好用递归了.... /* 75.二叉树两个结点的最低共同父结点(树) 题目:二叉树的结点定义如下: struct TreeNode {

二叉树两个结点的最低共同父结点 微信:318175542

入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点. 分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题.这个问题至 少有两个变种. 第一变种是二叉树是一种特殊的二叉树:查找二叉树.也就是树是排序过的,位于 左子树上的结点都比父结点小, 而位于右子树的结点都比父结点大. 我们只需要从根结点开 始和两个结点进行比较. 如果当前结点的值比两个结点都大, 则最低的共同父结点一定在当 前结点的左子树中. 如果当前结点的值比两个结点都小, 则最低的共同父结点一定在当前结 点的右子树中.

C++算法之 求二叉树两个节点的最低公共节点

方法1:递归方法: (1)如果两个节点分别在根节点的左子树和右子树,则返回根节点 (2)如果两个节点都在左子树,则递归处理左子树:如果两个节点都在右子树,则递归处理右子树 bool FindNode(BTree* pRoot, BTree* pNode) { if (pRoot == NULL || pNode == NULL) { return false; } if (pRoot == pNode) { return true; } bool found = FindNode(pRoot->

输出二叉树中随机两个结点的最小公共父结点

思路:当遇到一个结点是返回1,当左右子树都返回1的时候,即最小公共父节点. //二叉树的数据结构 typedef struct MyStruct { char data; struct MyStruct *leftChild; struct MyStruct *rightChild; }Node, *Tree; //查找方法 int findFirstFather(Tree root, char first, char second,char &destination){ int i, j; i

查找二叉树两节点的最近公共父节点

1 //查找一棵树中最近公共父节点 2 public class LCA { 3 static boolean flag[] = new boolean[2];; 4 5 public static TreeNode findLowestCommonAncestor(TreeNode head, TreeNode first, TreeNode second){ 6 travel(head, first, second); 7 if(flag[0] == true && flag[1] =

(算法)二叉树两个结点的最远距离

题目: 求二叉树两个结点的最远距离. 二叉树定义如下: class TreeNode{ public: int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; 思路: 遍历每个节点,找出以当前节点为根的最长路径,然后找出所有最长路径中的最大值. 代码: 代码1: class Node{ public: int val; Node* left; Node* right;

求二叉树中任意两个结点的距离

求二叉树中任意两个结点的距离 实现步骤: 计算跟到第一个结点的距离: 计算跟到第二个结点的距离: 计算lca: 计算跟到lca结点的距离: 结果为(1) + (2) - 2 * (4),因为重复计算了两次的从跟到lca结点的距离: 1 class Node(object): def __init__(self, value=0): self.value = value self.left = self.right = None def get_path_length(root, n, path)

求二叉树的给定两个结点之间的距离

给定一颗二叉树,和两个给定的结点,求出这两个结点之间的距离 拿到题目时不要认为是求出二叉树的结点之间的最大距离,题目是求两个结点的之间的距离 题目有几种情况 两个结点分布在根节点的左子树或者右子树 一个结点分布在根节点的左子树,一个结点分布在根节点的右子树 这两个结点是兄弟结点 一个结点是另外结点的祖先结点 本题的解题思路是 利用层次遍历的方法,获取每个结点的高度,根节点左子树的高度用正数表示,根节点右子树的高度用负数表示 这样当两个结点分布在:一个结点分布在根节点的左子树,一个结点分布在根节点