第26题——二叉搜索树与双向链表

163 阅读1分钟

题目:

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

思路:

结合二叉搜索树的性质,其中序遍历的顺序就是最终的有序序列。所以考虑中序遍历这棵树,最终要返回双向链表的首节点,即二叉搜索树左子树的最左边孩子。因此,设置一个记录此左孩子节点的指针。

Java

利用栈实现非递归中序遍历

package nowcoder;

import java.util.Stack;

public class S26_Convert {
    public TreeNode Convert(TreeNode pRootOfTree){
        if (pRootOfTree == null) return null;
        TreeNode p = pRootOfTree;
        TreeNode pre = null;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        boolean isFirst = true;
        while (p != null || !stack.isEmpty()){
            while (p != null){
                stack.push(p);
                p = p.left;
            }
            p = stack.pop(); //出栈
            if (isFirst){
                pRootOfTree = p;
                pre = p;
                isFirst = false;
            }
            else {
                p.left = pre;
                pre.right = p;
                pre = p;
            }
            p = p.right;
        }
        return pRootOfTree;
    }
}

Python

递归中序遍历

class Convert:
    def convert(self, pRootHead):
        if not pRootHead:
            return None
        if not pRootHead.left and not pRootHead.right:
            return pRootHead
        #左子树构建双向链表
        left = self.convert(pRootHead.left)
        p = left
        #找到左子树的最后一个节点
        while p and p.right:
            p = p.right
        if left:
            pRootHead.left = p
            p.right = pRootHead
        right = self.convert(pRootHead.right)
        if right:
            pRootHead.right = right
            right.left = pRootHead
        if left:
            return left
        else: return pRootHead