演算法題(三十五):二叉樹的下一個結點
阿新 • • 發佈:2018-11-24
題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
分析
分情況討論:
1.如果結點有右孩子,則返回右子樹中最後一個左孩子;
2.如果結點沒有右孩子,且該結點是父結點的左孩子,則返回父結點;
3.如果結點沒有右孩子,且該結點是父結點的右孩子,則向上遍歷父結點,返回第一個當前節點是父節點左孩子的節點
程式碼
public class NextOne { public static void main(String[] args) { // TODO Auto-generated method stub TreeLinkNode node1 = new TreeLinkNode(1); TreeLinkNode node2 = new TreeLinkNode(2); TreeLinkNode node3 = new TreeLinkNode(3); TreeLinkNode node4 = new TreeLinkNode(4); TreeLinkNode node5 = new TreeLinkNode(5); TreeLinkNode node6 = new TreeLinkNode(6); TreeLinkNode node7 = new TreeLinkNode(7); TreeLinkNode node8 = new TreeLinkNode(8); TreeLinkNode node9 = new TreeLinkNode(9); node6.left = node2; node6.right = node8; node2.next = node6; node8.next = node6; node2.left = node1; node2.right = node4; node8.left=node7; node8.right = node9; node1.next = node2; node4.next = node2; node7.next = node8; node9.next = node8; node4.left = node3; node4.right = node5; node3.next = node4; node5.next = node4; System.out.println(GetNext(node1).val); } //自己寫的 public static TreeLinkNode next(TreeLinkNode node){ if(node == null){ return null; } TreeLinkNode lastOne = null; if(node.right != null){ lastOne = node.right; TreeLinkNode temp = lastOne; while(lastOne != null){ temp = lastOne; lastOne = lastOne.left; } lastOne = temp; return lastOne; } if(node.next.left == node){ return node.next; } TreeLinkNode parent = node.next; while(parent!=null){ if(parent.next.left == parent){ return parent.next; } parent = parent.next; } return null; } //牛客網上的 public static TreeLinkNode GetNext(TreeLinkNode node) { if (node == null) return null; if (node.right != null) { // 如果有右子樹,則找右子樹的最左節點 node = node.right; while (node.left != null) node = node.left; return node; } while (node.next != null) { // 沒右子樹,則找第一個當前節點是父節點左孩子的節點 if (node.next.left == node) return node.next; node = node.next; } return null; // 退到了根節點仍沒找到,則返回null } } class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; } }