二叉树中找到俩个节点的最低公共祖先

来源:互联网 发布:全球云计算开源大会 编辑:程序博客网 时间:2024/06/05 03:25

方法一

下面是一个简单的复杂度为 O(n) 的算法,解决LCA问题
1) 找到从根到n1的路径,并存储在一个向量或数组中。
2)找到从根到n2的路径,并存储在一个向量或数组中。
3) 遍历这两条路径,直到遇到一个不同的节点,则前面的那个即为最低公共祖先.

方法二 (不利用额外空间,一次遍历)

从root开始遍历,如果n1和n2中的任一个和root匹配,那么root就是LCA。 如果都不匹配,则分别递归左、右子树,如果有一个 key(n1或n2)出现在左子树,并且另一个key(n1或n2)出现在右子树,则root就是LCA. 如果两个key都出现在左子树,则说明LCA在左子树中,否则在右子树。

public class App {    static class Node {        Node left;        Node right;        int key;        Node(int key) {            this.key = key;            this.left = null;            this.right = null;        }    }    static Node findLCA(Node root, int n1, int n2) {        if(root == null) {            return null;        }        if(root.key == n1 || root.key == n2) {            return root;        }        Node left = findLCA(root.left, n1, n2);        Node right = findLCA(root.right, n1, n2);        if(left!=null && right!=null) {            return root;        }        else {            return left!=null?left:right;        }    }    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);        System.out.println(findLCA(root, 4, 6).key);    }}
0 0
原创粉丝点击