(不懂)二叉搜索树与双向链表

折月煮酒 提交于 2019-11-29 10:30:42

 

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

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)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!