JZ26 二叉搜索树与双向链表

原题链接


描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

注意:

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构

4.你不用输出或者处理,示例中输出里面的英文,比如"From left to right are:"这样的,程序会根据你的返回值自动打印输出


示例1

输入:{10,6,14,4,8,12,16}
返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;

示例2

输入:{5,4,#,3,#,2,#,1}
返回值:From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;
说明:
                    5
                  /
                4
              /
            3
          /
        2
      /
    1
树的形状如上图  

思路

主要是中序遍历,然后在遍历结点时更改指针方向。一般来说二叉搜索树的中序遍历结果就已经是一个排序的列表了,但要求是双向链表,所以每次要保存上一个结点。


解答

import java.util.Stack;

public class Solution {

    public static TreeNode Convert(TreeNode root) {
        if (root == null) return null;

        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode p = root;//处理的结点
        TreeNode pre = null;// 用于保存中序遍历序列的上一节点
        boolean isFirst = true;

        while (p != null || !stack.isEmpty()) {
            while (p != null) {
                stack.push(p);
                p = p.left;
            }
            p = stack.pop();
            if (isFirst) {
                root = p;// 将中序遍历序列中的第一个节点记为root
                pre = root;
                isFirst = false;
            } else {                
                pre.right = p;// p 是 pre 的后继结点                
                p.left = pre;// pre 是 p 的前驱节点
                pre = p;
            }
            p = p.right;
        }
        return root;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值