您的位置:首页 > 其它

Cracking the coding interview--Q4.5

2014-11-17 16:06 274 查看
原文:

Write an algorithm to find the ‘next’ node (i.e., in-order successor) of a given node in a binary search tree where each node has a link to its parent.

译文:

给定二叉查找树的一个结点, 写一个算法查找它的“下一个”结点(即中序遍历后它的后继结点), 其中每个结点都有指向其父亲的链接。

我们知道,在二叉查找树中, 每个结点的值都大于等于它左子树所有结点的值且小于右子树所有结点的值( 或是大于它左子树所有结点的值且小于等于右子树所有结点的值,等号放哪边示情况而定。) 二叉查找树中序遍历后,元素将按递增排序, 某一结点的后继结点即为比该结点大的结点中最小的一个。如果该结点有右儿子,
则后继结点为右儿子的最左子孙。否则需要不断地向上查找该结点的祖先, 直到找到第一个比它大的结点为止。

public static Node_4_3 nextNode(Node_4_3 node) {
while(node.lchild != null) {
node = node.lchild;
}
return node;
}

/**
* @param node
* @return
*
* 获取中序遍历当前结点的next结点
*
*/
public static Node_4_3 successor(Node_4_3 node) {
if(node == null) {
return null;
}
// 如果当前结点存在右子树,则next结点即为右子树最左边结点
if(node.rchild != null) {
return nextNode(node.rchild);
} else {
// 如果不存在右子树,则next节点往上走
Node_4_3 parent = node.parent;
while(parent !=null && parent.rchild == node) {
parent = parent.parent;
node = parent;
}
return parent;
}
}

总代码如下:

package chapter_4_TreesandGraphs;

import java.util.Scanner;

public class Question_4_5 {

public static void create_MinHeight_Tree(Node_4_3 parent, int array[], int start, int end, boolean left) {
if(start <= end) {
int mid = (start + end) >> 1;
Node_4_3 node = new Node_4_3();
node.data = array[mid];
node.parent = parent;
// 构建左子树
if(left == true) {
parent.lchild = node;
} else {
parent.rchild = node;
}
create_MinHeight_Tree(node, array, start, mid-1, true);
create_MinHeight_Tree(node, array, mid+1, end, false);
}
}

public static Node_4_3 nextNode(Node_4_3 node) {
while(node.lchild != null) {
node = node.lchild;
}
return node;
}

/**
* @param node
* @return
*
* 获取中序遍历当前结点的next结点
*
*/
public static Node_4_3 successor(Node_4_3 node) {
if(node == null) {
return null;
}
// 如果当前结点存在右子树,则next结点即为右子树最左边结点
if(node.rchild != null) {
return nextNode(node.rchild);
} else {
// 如果不存在右子树,则next节点往上走
Node_4_3 parent = node.parent;
while(parent !=null && parent.rchild == node) {
parent = parent.parent;
node = parent;
}
return parent;
}
}

/**
*
* 中序递归遍历
*
*/
public static void inOrderTraverse(Node_4_3 node) {
if(node != null) {
inOrderTraverse(node.lchild);
System.out.print(" " + node.data + " ");
inOrderTraverse(node.rchild);
}
}

public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();

String strs[] = string.split(" ");
int array[] = new int[strs.length];
for(int i=0; i<array.length; i++) {
array[i] = Integer.parseInt(strs[i]);
}

Node_4_3 head = new Node_4_3();
int mid = (0 + (array.length-1)) >> 1;
head.data = array[mid];

create_MinHeight_Tree(head, array, 0, mid-1, true);
create_MinHeight_Tree(head, array, mid+1, array.length-1, false);

inOrderTraverse(head);

System.out.println("\nnext :" + successor(head).data);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法