• 数据结构练习(36)二叉树两结点的最低共同父结点


    http://zhedahht.blog.163.com/blog/static/25411174201081263815813/

    思路1:

    1. 构建从head到node的path,这个递归的思路需要借鉴。

    2. 从2条path中得到公共节点,然后就可以利用以前的方法了。

    #include <list>
    using namespace std;
    
    struct tree{
        int m_value;
        tree* m_lhs;
        tree* m_rhs;
    };
    
    bool GetNodePath(tree* head, tree* node, list<tree*>& path)
    {
        if (head == node)
            return true;
    
        path.push_back(head);
    
        bool found = false;
        if (head->m_lhs)
            found = GetNodePath(head->m_lhs, node, path);
        if (!found && head->m_rhs)
            found = GetNodePath(head->m_rhs, node, path);
    
        if (!found)
            path.pop_back();
    
        return found;
    }
    
    tree* LastCommonNode(const list<tree*>& path1, const list<tree*>& path2)
    {
        list<tree*>::const_iterator iter1 = path1.begin();
        list<tree*>::const_iterator iter2 = path2.begin();
    
        tree* lastnode = nullptr;
        
        while (iter1 != path1.end() && iter2 != path2.end())
        {
            if (*iter1 == *iter2)
                lastnode = *iter1;
    
            ++iter1, ++iter2;
        }
        return lastnode;
    }
    
    tree* GetCommonParent(tree* head, tree* node1, tree* node2)
    {
        if (head == nullptr || node1 == nullptr || node2 == nullptr)
            return nullptr;
    
        list<tree*> path1;
        GetNodePath(head, node1, path1);
    
        list<tree*> path2;
        GetNodePath(head, node2, path2);
    
        return LastCommonNode(path1, path2);
    }

    思路2:

    也是递归,如果找到node则返回1,找不到则返回0.

    TreeNode* lca = NULL;
    int traverse(TreeNode* p, TreeNode* p1, TreeNode* p2) {
        if (!p) return 0;
        if (p == p1 || p == p2) return 1;
        int res = traverse(p->m_pLeft, p1, p2) + traverse(p->m_pRight, p1, p2);
        if (res == 2 && lca == NULL) lca = p;
        return res;
    }

    变型:

    如果该树为二叉查找树的话,就要稍微变换下思路了。

    如果2个节点的值都小于根节点,则在其左边,否则在右边。

     

    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    接口的基本语法
    包和访问权限(三)
    包和访问权限(二)
    包和访问权限(一)
    为什么用抽象类
    html5,单击显示详细信息
    html5,格式的验证
    html5,加密元素
    html5,新增的元素,fieldset legend
    html5,进度条
  • 原文地址:https://www.cnblogs.com/kedebug/p/2823440.html
Copyright © 2020-2023  润新知