• 二叉树 最近祖先lca + 两个结点的最小路径


    http://www.acmerblog.com/distance-between-given-keys-5995.html

    lca在后序遍历中找,

    tralian算法还不会,懂了再补充

    有了lca就好求路径了,做差而已了。

    //============================================================================
    // Name        : TreeNodesDistance.java
    // Author      : GaoTong
    // Date        : 2014/7/26
    // Copyright   : www.acmerblog.com
    //============================================================================
    
    class Node{
        Node left,right;
        int key;
    
        public Node(int i) {
            this.key = i;
        }
    }
    
    public class TreeNodesDistance {
    
        //返回node节点在root中的第几层,-1表示没有在root子树下找到
        public static int findLevel(Node root, int node){
            if(root == null) return -1;
            if(root.key == node) return 0;
            //先在左子树查找
            int level = findLevel(root.left, node);
            //左子树没有找到则到右子树查找
            if(level == -1){
               level = findLevel(root.right, node);
            }
            if(level != -1)
                return level+1;
            return -1;
        }
    
        public static Node findLCA(Node root, int node1,int node2){
            if(root == null) return null;
    
            //找到两个节点中的一个就返回
            if(root.key == node1 || root.key == node2){
                return root;
            }
    
            //分别在左右子树查找两个节点
            Node left_lca = findLCA(root.left, node1, node2);
            Node right_lca = findLCA(root.right, node1, node2);
    
            if(left_lca != null && right_lca != null){
                //此时说明,两个节点肯定是分别在左右子树中,当前节点比为LCA
                return root;
            }
            return left_lca != null ? left_lca : right_lca;
        }
    
        public static int distanceNodes(Node root, int node1, int node2){
            Node lca = findLCA(root, node1, node2);
            int dis_lca = findLevel(root, lca.key);
            int dis1 = findLevel(root, node1);
            int dis2 = findLevel(root, node2);
            return dis1 + dis2 - 2*dis_lca;
        }
    
        public static void main(String args[]){
            Node root = new Node(1);
            root.left = new Node(2);
            root.right = new Node(3);
            root.left.left = new Node(4);
            root.left.right = new Node(5);
            root.right.left = new Node(6);
            root.right.right = new Node(7);
            root.right.left.right = new Node(8);
    
            System.out.println("Dist(8,7) = " + distanceNodes(root, 8,7));
            System.out.println("Dist(8,3) = " + distanceNodes(root, 8,3));
            System.out.println("Dist(8,3) = " + distanceNodes(root, 8,2));
        }
    }
    

      

  • 相关阅读:
    接口新建学习---边界提取器
    Android Studio打包.so文件教程
    想要开发好的软件,必须学会这几项!
    你应该首先保护哪些应用程序?这个问题本身问错了!
    几周内搞定Java的10个方法
    翻译:程序员做些业余项目的重要性
    【源码】c#编写的安卓客户端与Windows服务器程序进行网络通信
    10款GitHub上最火爆的国产开源项目
    你的Android应用完全不需要那么多的权限
    2015年移动领域发展的九大趋势
  • 原文地址:https://www.cnblogs.com/juandx/p/4164047.html
Copyright © 2020-2023  润新知