输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
public class Solution {
private TreeNode pre = null; //上一个节点
private TreeNode head = null; //当前节点
public TreeNode Convert(TreeNode root) {
inOrder(root);
return head;
}
private void inOrder(TreeNode node) { //输入一个 node
if (node == null) //判空
return;
inOrder(node.left); // 左孩子递归
node.left = pre; // 上个节点赋值给 left
if (pre != null) //如果上个节点不为空
pre.right = node; //node 给
pre = node;
if (head == null)
head = node;
inOrder(node.right);
}
}
解题思路:
1.核心是中序遍历的非递归算法。
2.修改当前遍历节点与前一遍历节点的指针指向。
import java.util.Stack;
public TreeNode ConvertBSTToBiList(TreeNode root) {
if(root==null) //判空
return null;
Stack<TreeNode> stack = new Stack<TreeNode>(); //使用系统的栈
TreeNode p = root; //当前的节点声明变量 p
TreeNode pre = null;// 用于保存中序遍历序列的上一节点
boolean isFirst = true; //声明一个 boolean 变量,初始值为 true
while(p!=null||!stack.isEmpty()){ // 当 p 不为空或者 栈不为空时,循环
while(p!=null){ // 当 p 不为空时,
stack.push(p); // 添加元素的方法push(),添加到栈里
p = p.left; //把 p 的左孩子赋值给 p
}
p = stack.pop(); //当遍历到叶子节点时,即 p 为 空,弹出栈的栈顶元素,赋值为 p
if(isFirst){
root = p;// 将中序遍历序列中的第一个节点记为root
pre = root;
isFirst = false;
}else{
pre.right = p;
p.left = pre;
pre = p;
}
p = p.right;
}
return root;
}
对于当前结点,先输出它的左孩子,然后输出该结点,最后输出它的右孩子。(left——index——right)