ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二叉树的最近公共祖先--递归解法

2021-02-14 17:35:04  阅读:116  来源: 互联网

标签:TreeNode 递归 val -- 二叉树 new root public left


 

来源: https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetc-2/

信息分类: IT/算法

目标用户: 程序员/java

相关知识点:二叉树、递归

 

算法关键源码解析:

 

 

 

 

如下图,是构造的一颗二叉树,现在需要找出节点N7,节点N8的最近公共祖先。

 

                  3
     5             1
6        2      0      8
      7     4

 

以上算法中采用的是递归算法,递归算法写起来代码简洁,但没那么直观,理解起来比较费劲,下面用对具体的代码块进行了标号,

如下嵌套表展现代码的执行过程,有助有帮助大家理解递归的执行过程。

 

 

 

 

 

1

N3

2

T

1

N5

2

F

1

N6

2

F

1

NULL

2

-

3

-

4

-

5

-

 

3

F

1

NULL

2

-

3

-

4

-

5

-

 

4

-

5

F

 

3

T

2

T

1

N7

2

1

NULL

2

-

3

-

4

-

5

-

 

3

1

NULL

2

-

3

-

4

-

5

-

 

4

-

5

T

 

3

F

1

N4

 ...

..

 

4

-

5

T

 

4

-

5

T

 

3

T

1

N1

..

..

 

4

T  终极答案

5

--

 

 

 

完整源码:


class Solution {

    private TreeNode ans;

    public Solution() {
        this.ans = null;
    }

    private boolean dfs(TreeNode root, TreeNode p, TreeNode q) {
        System.out.println("节点:" + root);
        if (root == null) {
            System.out.println("=====:null==>" + false);
            return false;
        }
        boolean lson = dfs(root.left, p, q);
        boolean rson = dfs(root.right, p, q);
        if ((lson && rson) || ((root.val == p.val || root.val == q.val) && (lson || rson))) {
            ans = root;
        }
        boolean b=lson || rson || (root.val == p.val || root.val == q.val);
        System.out.println("=====:"+root+ "==>" + b);
        return b;
    }

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        this.dfs(root, p, q);
        return this.ans;
    }

    public static void main(String[] args) {
        TreeNode n1 = new TreeNode(3, 5, 1);
        n1.left.left = new TreeNode(6);
        n1.left.right = new TreeNode(2, 7, 4);
        n1.right = new TreeNode(1, 0, 8);

        TreeNode n = new Solution().lowestCommonAncestor(n1, new TreeNode(8), new TreeNode(7));
        System.out.println(n);
    }

}

class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }

    public TreeNode(int val, int left, int right) {
        TreeNode l = new TreeNode(left);
        TreeNode r = new TreeNode(right);
        this.val = val;
        this.left = l;
        this.right = r;
    }

    @Override
    public String toString() {
        return "" + this.val;
    }
}

 

  

标签:TreeNode,递归,val,--,二叉树,new,root,public,left
来源: https://www.cnblogs.com/kevin7234/p/14402255.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有