给定一棵二叉树和其中的一个结点,找出中序遍历序列的下一个节点。(树中的节点有指向左右子节点和父节点指针)。
二叉树节点类
public class TreeNode {
private int item;
private TreeNode left;
private TreeNode right;
private TreeNode parent;
public TreeNode(int item) {
this.item = item;
}
//getter和setter
}
根据前序序列构建带有父节点的二叉树
/**
* 根据前序遍历构建带有父节点指针的二叉树
* @param linkedList 前序遍历链表
* @param parent 父节点
* @return 返回二叉树
*/
private static TreeNode createTree(LinkedList<Integer> linkedList,TreeNode parent){
if (linkedList == null || linkedList.isEmpty()){
return null;
}
//前序遍历的首元素即为子树的根节点
Integer item = linkedList.removeFirst();
TreeNode node = null;
if (item != null){
node = new TreeNode(item);
node.setParent(parent);
node.setLeft(createTree(linkedList,node));
node.setRight(createTree(linkedList,node));
}
return node;
}
二叉树的下一个节点
/**
* 根据某一个结点,获取中序遍历的下一个节点
* @param node 某一个节点
* @return 返回下一个节点
*/
private static TreeNode getNextItem(TreeNode node){
//右子树存在,下一个节点为右子树的最左节点
if (node.getRight() != null){
TreeNode left = node.getRight();
while (left.getLeft() != null){
left = left.getLeft();
}
return left;
}
TreeNode parent = node.getParent();
//右子树为空,且该节点为左节点,则下一个节点为该节点的父节点
if (parent.getLeft() == node && node.getRight()==null) {
return parent;
}
//右子树为空,且该节点为右结点,遍历父节点,直到找到某一节点为左节点,则该左节点的父节点为下一个节点。
// 若找不到此节点,则说明当前节点在中序遍历中为最后一个元素,下一个节点为空
if (parent.getRight() == node && node.getRight() == null){
while (parent.getParent() != null){
if (parent.getParent().getLeft() == parent){
return parent.getParent();
}
parent = parent.getParent();
}
//当前节点在中序遍历中为最后一个元素,下一个节点为空
return new TreeNode(-1);
}
return new TreeNode(-1);
}
中序遍历
/**
* 中序遍历
* @param node
*/
private static void inOrderTraveral(TreeNode node){
if (node == null){
return;
}
inOrderTraveral(node.getLeft());
System.out.print(node.getItem() + " ");
inOrderTraveral(node.getRight());
}
测试
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>(
Arrays.asList(new Integer[]{3,2,9,null,null,10,null,null,8,null,4}));
TreeNode node = createTree(list,null);
System.out.println("中序遍历:");
inOrderTraveral(node);
System.out.println();
TreeNode testNode = node.getLeft().getRight();
System.out.println("给定的节点值:"+testNode.getItem());
System.out.println("下一个节点值:"+getNextItem(testNode).getItem());
}
结果
中序遍历:
9 2 10 3 8 4
给定的节点值:10
下一个节点值:3