版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
37.树中两个节点的最低公共祖先(未完成)(326)
-
题目描述:输入一棵树的根节点,输入两个被观察节点,求这两个节点的最低(最近)公共祖先。
-
如果是一颗二叉搜索树:两个结点的最近根结点的值位于两个结点的值之间。
(1)如果根结点的值大于两个结点的值,最低公共父结点在当前根结点的左子树中。
(2)如果根结点的值小于两个结点的值,最低公共父结点在当前根结点的右子树中。
(3)如果根结点的值位于两个结点值之间,则该结点为两个结点的最低公共父结点。
package _37.树中两个节点的最低公共祖先; public class CommonParentInBTree { /** * 1.如果为一颗二叉搜索树 * @param node1 * @param node2 * @return */ public static TreeNode getLastedParent(TreeNode root,TreeNode node1,TreeNode node2){ if(root == null || node1 == null || node2 == null) return null; TreeNode cur = root; while(cur != null){ //如果根结点的值大于两个结点的值,最低公共父结点在当前根结点的左子树中。 if(cur.val > node1.val && cur.val >node2.val){ cur = cur.left; } //如果根结点的值小于两个结点的值,最低公共父结点在当前根结点的右子树中。 if(cur.val < node1.val && cur.val < node2.val){ cur = cur.right; } //如果根结点的值位于两个结点值之间,则该结点为两个结点的最低公共父结点。 else{ return cur; } } return null; } /** * 5 * / \ * 3 7 * / \ / \ * 2 4 6 8 * @param args */ public static void main(String[] args) { TreeNode root = new TreeNode(5); root.left = new TreeNode(3); root.left.left = new TreeNode(2); root.left.right = new TreeNode(4); root.right = new TreeNode(7); root.right.left = new TreeNode(6); root.right.right = new TreeNode(8); TreeNode parent = getLastedParent(root,root.left.left, root.right.left); System.out.println(parent); } } class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } @Override public String toString() { return "TreeNode [val=" + val + "]"; } }
-
如果是一颗普通的二叉树,但是结点中有指向父结点的指针。
如果结点中有指向其父结点的指针,就访问两个结点的父结点,如果不相同,则继续访问其父结点。直到找到相同的父结点为止。
题目转化为查找两个单链表的第一个相交的结点。
-
只是一颗普通的二叉树,没有父结点。