• leetCode(39):Lowest Common Ancestor of a Binary Tree 分类: leetCode 2015-07-17 10:03 114人阅读 评论(0) 收藏


    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______3______
           /              
        ___5__          ___1__
       /              /      
       6      _2       0       8
             /  
             7   4
    

    For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

    首先找出自根结点到两个结点的路径,并保存,然后找这两条路径最后一个相同的结点

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool getPath(TreeNode* root, TreeNode* node, list<TreeNode*>& path)
        {
        	if (root == node)
        	{
        		path.push_back(root);
        		return true;
        	}
        	path.push_back(root);
        
        	TreeNode* tmp = root;
        
        	bool found_left = false;
        	bool found_right = false;
        
        	if (tmp->left)
        		found_left = getPath(tmp->left, node, path);
        	if (!found_left && tmp->right)
        	{//右子树中没有则在其左子树中寻找
        		found_right = getPath(tmp->right, node, path);
        	}
        	
        	if (!found_left && !found_right)//左右子树中都未找到,则路径错误
        		path.pop_back();
        
        	return found_left || found_right;//返回查找结果
        }
    
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            if (root == NULL)
        		return NULL;
        	list<TreeNode*> path1, path2;
        	getPath(root, p, path1);
        	getPath(root, q, path2);
        	list<TreeNode*>::iterator iter1, iter2;
        	iter1 = path1.begin();
        	iter2 = path2.begin();
        	TreeNode* plast=NULL;
        	while (iter1 != path1.end() && iter2 != path2.end())
        	{
        		if (*iter1 == *iter2)
        		{//查找最后一个相同的结点,在此之前,都是相同的
        			plast = *iter1;
        		}
        		iter1++;
        		iter2++;
        	}
        	return plast;
        }
    };



  • 相关阅读:
    [转]C# winform窗体(cs文件) .Designer.cs、.resx 文件分离出来 同级问题
    [转]C# winform窗体(cs文件) .Designer.cs、.resx 文件分离出来 同级问题
    C#中SqlDataAdapter的使用小结
    C#中SqlDataAdapter的使用小结
    C#如何以TEXTBOX控件中输入的内容查找数据库其他内容
    C#如何以TEXTBOX控件中输入的内容查找数据库其他内容
    Dock Fill
    Dock Fill
    C# winform 读取数据库并显示成datagrid
    C# winform 读取数据库并显示成datagrid
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687060.html
Copyright © 2020-2023  润新知