zoukankan      html  css  js  c++  java
  • 二叉树的最近公共祖先--递归解法

     

    来源: 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;
        }
    }

      

  • 相关阅读:
    Java中关键字优先级
    HashMap
    Mabatis通用SQL语句
    下滑线转换为驼峰
    常见问题整理
    常见问题整理
    VUE学习笔记(二)
    VUE学习笔记(一)
    获取鼠标位置
    VirtualBox NAT模式,设置虚拟机可上网,宿主机可访问虚拟机的方法
  • 原文地址:https://www.cnblogs.com/kevin7234/p/14402255.html
Copyright © 2011-2022 走看看