public class Main8
{
public static LineTreeNode pre = null;
public static int count = 0;
/**
* 输入一个节点的值,输出这个节点的中序遍历结果的下一个节点
* @param root
* @param list
* @param k
* @param count
*/
private static void printLineTree(LineTreeNode root, List<Integer> list, int k, int count)
{
if (root == null) return;
while (list.size() != count && root != null)//!!!这里加了一个判断,是因为,当所有节点都线索化后存入了List中就可以结束了
{
//1.找到最左子树的最左节点
while (list.size() != count && root.leftType != 0)
{
root = root.left;
}
list.add(root.val);
//2.后继节点
while (list.size() != count && root.rightType == 0)
{
list.add(root.right.val);
root = root.right;
}
//3.调整
root = root.right;
}
if (list.get(list.size()-1) == k)return;//!!!最后一个节点没有后继节点
for (int i = 0; i < list.size(); i++)
{
if (k == list.get(i))
{
System.out.println(list.get(i+1));//输出种族遍历的下一个节点
return;
}
}
}
/**
* 中序线索化二叉树
* @param root
*/
private static void lineTree(LineTreeNode root)
{
if (root == null) return;
//1.线索化左子节点
lineTree(root.left);
//2.线索化当前节点
if (root.left == null)
{
root.left = pre;
root.leftType = 0;
}
if (pre != null && pre.right == null)
{
pre.right = root;
pre.rightType = 0;
}
pre = root;
//3.线索化右子节点
lineTree(root.right);
}
/**
* 前序遍历一下,求出树有多少个节点
* @param root
*/
private static void pre(LineTreeNode root)
{
if (root == null) return;
count++;
pre(root.left);
pre(root.right);
}
public static void main(String[] args)
{
LineTreeNode root = new LineTreeNode(1);
LineTreeNode n1 = new LineTreeNode(3);
LineTreeNode n2 = new LineTreeNode(6);
LineTreeNode n3 = new LineTreeNode(8);
LineTreeNode n4 = new LineTreeNode(10);
LineTreeNode n5 = new LineTreeNode(14);
root.left = n1;
root.leftType = 1;
root.right = n2;
root.rightType = 1;
n1.left = n3;
n1.leftType = 1;
n1.right = n4;
n1.rightType = 1;
n2.left = n5;
n2.leftType = 1;
LineTreeNode countNode = root;
pre(root);//求节点的个数的
LineTreeNode temp = root;
lineTree(temp);//中序线索化二叉树
printLineTree(root, new ArrayList<Integer>(), new Scanner(System.in).nextInt(),count);//中序遍历线索化后的二叉树,并且找到给定节点的下一个节点
}
}
class LineTreeNode {
public int val;
public LineTreeNode left;
public int leftType;
public LineTreeNode right;
public int rightType;
public LineTreeNode (int val){
this.val = val;
}
}
【剑指offer系列】-08二叉树的下一个节点(关键字:线索化二叉树、中序、遍历线索化二叉树)
猜你喜欢
转载自blog.csdn.net/tmax52HZ/article/details/107833815
今日推荐
周排行