1. 程式人生 > 其它 >在二叉樹中找到一個節點的後繼節點

在二叉樹中找到一個節點的後繼節點

在二叉樹的中序遍歷的序列中,node的下一個節點叫作node的後繼節點。

該結構比普通二又樹節點結構多了一個指向父節點的parent指標。
假設有一棵Node型別的節點組成的二叉樹,樹中每個節點的parent指標都正確地指向自己的父節點,頭節點的parent指向null。
只給一個在二叉樹中的某個節點node,請實現返回node的後繼節點的函式。

思路:找節點x的後繼節點

程式碼:

package Algorithms.tree;

public class SuccessorNode {

    public static class Node {
        public int value;
        
public Node left; public Node right; public Node parent; public Node(int data) { this.value = data; } } //求某一個節點的後繼節點 public static Node getSuccessorNode(Node node) { if (node == null) { return node; } if (node.right != null
) { //有右子樹 return getLeftMost(node.right); } else { //無右子樹 Node parent = node.parent; //找到其父節點 //while迴圈找當前節點是其父節點的左子樹 while (parent != null && parent.left != node) { //當前節點是其父節點的右子樹 node = parent; //node往上走到parent的位置 parent = node.parent; //
parent來到node父節點的位置 } //當前節點是其父節點的左子樹 或者 父節點為空(node是整棵樹最右節點時)時退出while迴圈 return parent; //退出迴圈說明找到了後繼節點 } } //返回一個節點子樹中最左的Node public static Node getLeftMost(Node node) { if (node == null) { return node; } while (node.left != null) { node = node.left; } return node; } public static void main(String[] args) { Node head = new Node(6); head.parent = null; head.left = new Node(3); head.left.parent = head; head.left.left = new Node(1); head.left.left.parent = head.left; head.left.left.right = new Node(2); head.left.left.right.parent = head.left.left; head.left.right = new Node(4); head.left.right.parent = head.left; head.left.right.right = new Node(5); head.left.right.right.parent = head.left.right; head.right = new Node(9); head.right.parent = head; head.right.left = new Node(8); head.right.left.parent = head.right; head.right.left.left = new Node(7); head.right.left.left.parent = head.right.left; head.right.right = new Node(10); head.right.right.parent = head.right; Node test = head.left.left; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.left.left.right; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.left; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.left.right; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.left.right.right; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.right.left.left; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.right.left; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.right; System.out.println(test.value + " next: " + getSuccessorNode(test).value); test = head.right.right; // 10's next is null System.out.println(test.value + " next: " + getSuccessorNode(test)); } } //中序遍歷結果:1,2,3,4,5,6,7,8,9 /** * 1 next: 2 * 2 next: 3 * 3 next: 4 * 4 next: 5 * 5 next: 6 * 6 next: 7 * 7 next: 8 * 8 next: 9 * 9 next: 10 * 10 next: null */