每天一道剑指offer-二叉搜索树与双向链表

题目描述

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

思路:

由于二叉搜索树的特点可以知道,他的中序遍历就是他的排序,重点是怎么把各个结点的值连起来,形成双向链表。我们使用非递归的中序遍历来试一下。

代码:

public class Solution {
    TreeNode Head = null;
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null)
            return pRootOfTree;
        TreeNode curr = pRootOfTree;
        TreeNode pre = null;
        Stack<TreeNode> stack = new Stack<>();
        while(curr != null || !stack.isEmpty()){
            if(curr != null){
                stack.push(curr);
                curr = curr.left;
            }else{
                curr = stack.pop();
                if(Head == null){
                    Head = curr;
                    pre = Head;
                }//说明是第一个
                else{
                    pre.right = curr;
                    curr.left = pre;
                    pre = curr;
                }
                curr = curr.right;
            }
        }
        return Head;
        }}

附上非递归中序二叉树的代码:

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root==null){
            return list;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curr = root;
        while(curr != null || !(stack.isEmpty())){
            if(curr!= null){
                stack.push(curr);
                curr = curr.left;
            }else{
                curr = stack.pop();
                list.add(curr.val);
                curr = curr.right;
            }
        }
        return list;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42069523/article/details/88877064