二叉树编程专题--查找最低公共父节点

来源:互联网 发布:xio网络用语什么意思 编辑:程序博客网 时间:2024/05/22 08:50

1.题目

给定二叉树,计算出两个给定的结点的公共结点。

2.解法–递归

从根节点开始,递归遍历左右子树,查看是否从该节点能遍历到这两个给定的结点中的至少一个,返回能遍历到的指定节点,如果都能遍历到,返回的是最低父节点。当然能否遍历到是依靠下层遍历的结果的。具体看代码:

public static Tree beginFind(Tree node, Tree oneNode, Tree anotherNode) {    if (node == null) {        return null;    }    // 当前节点正好是关心的两个节点中的一个,返回当前节点,表示找到了一个节点    if (node == oneNode || node == anotherNode) {        return node;    }    // 看当前节点的左子树是否包含两个指定节点    Tree leftNode = beginFind(node.leftChild, oneNode, anotherNode);    // 看当前节点的左子树是否包含两个指定节点    Tree rightNode = beginFind(node.rightChild, oneNode, anotherNode);    // 返回左右结果中不为空的值,如果都不为空(也就是找到了最低公共父节点),则返回当前节点(最低公共父节点)    if (leftNode == null) {        return rightNode;    }else if (rightNode == null) {        return leftNode;    }else {        // 当左右子树分别找到一个结点时,这个结点就是最低的公共父节点,返回该公共父节点。        // 回到上一层递归时,因为另外的beginFind方法返回的必然是null,因此继续返回该公共节点,直到最上层结束。        return node;    }}public static void main(String[] args) {    // 初始化一个树    Tree node0 = new Tree(0);    Tree node1 = new Tree(1);    Tree node2 = new Tree(2);    Tree node3 = new Tree(3);    Tree node4 = new Tree(4);    Tree node5 = new Tree(5);    Tree node6 = new Tree(6);    Tree node7 = new Tree(7);    Tree node8 = new Tree(8);    Tree node9 = new Tree(9);    Tree node10 = new Tree(10);    node0.leftChild = node1;    node0.rightChild = node2;    node1.leftChild = node3;    node1.rightChild = node4;    node2.leftChild = node5;    node2.rightChild = node6;    node3.leftChild = node7;    node3.rightChild = node8;    node4.leftChild = node9;    node4.rightChild = node10;    // 开始查找最低父节点    Tree resultNode = beginFind(node0, node4, node8);    System.out.println(resultNode.value);}
原创粉丝点击