package swordOffre.gaopengyu; class TreeNodeWithParent { String val; TreeNodeWithParent left; TreeNodeWithParent right; TreeNodeWithParent parent; TreeNodeWithParent(String val, TreeNodeWithParent left, TreeNodeWithParent right, TreeNodeWithParent parent) { this.val = val; this.left = left; this.right = right; this.parent = parent; } } public class NextNodeInBST8 { public static void main(String[] args) { TreeNodeWithParent node9 = new TreeNodeWithParent("i", null, null, null); TreeNodeWithParent node8 = new TreeNodeWithParent("h", null, null, null); TreeNodeWithParent node7 = new TreeNodeWithParent("g", null, null, null); TreeNodeWithParent node6 = new TreeNodeWithParent("f", null, null, null); TreeNodeWithParent node5 = new TreeNodeWithParent("e", node8, node9, null); TreeNodeWithParent node4 = new TreeNodeWithParent("d", null, null, null); TreeNodeWithParent node3 = new TreeNodeWithParent("c", node6, node7, null); TreeNodeWithParent node2 = new TreeNodeWithParent("b", node4, node5, null); TreeNodeWithParent node1 = new TreeNodeWithParent("a", node2, node3, null); node2.parent = node1; node3.parent = node1; node4.parent = node2; node5.parent = node2; node6.parent = node3; node7.parent = node3; node8.parent = node5; node9.parent = node5; // TreeNodeWithParent result = findNextNodeInBSTInOrder(node1); // TreeNodeWithParent result = findNextNodeInBSTInOrder(node4); TreeNodeWithParent result = findNextNodeInBSTInOrder(node9); System.out.println(result.val); } public static TreeNodeWithParent findNextNodeInBSTInOrder(TreeNodeWithParent node) { // 右子树不空的情况下,右子树的最左节点就是二叉树中序遍历的下一份节点 if (node.right != null) { node = node.right; while (node.left != null) { node = node.left; } return node; } // 右子树为空,并且这个节点是父节点的左子节点的情况下,父节点就是二叉树中序遍历的下一份节点 if (node.right == null && node.parent.left == node) { return node.parent; } // 右子树为空,并且这个节点是父节点的右子节点的情况下,向上找第一个是它父节点的左子节点的节点,就是二叉树中序遍历的下一份节点 while (node.parent == node.parent.parent.right) { node = node.parent; } return node.parent.parent; } }
二叉树的下一份节点8
最新推荐文章于 2024-09-02 21:27:08 发布