zoukankan      html  css  js  c++  java
  • 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;
        }
    };



  • 相关阅读:
    linux c/c++ 获取文件大小
    android 打开各种文件(setDataAndType)
    Android framework系统默认设置修改
    android的 root权限
    [Power]待机电流问题,如何查找wakelock
    Android.mk for your own module
    通过adb 发送广播
    ubuntu下minicom的安装及使用
    ubuntu 下使用 putty 调试
    Android平台Overlay机制
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687060.html
Copyright © 2011-2022 走看看