剑指Offer:二叉搜索树与双向链表Java/Python

1.题目描述

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

2.算法描述

有一题中有写到二叉搜索树的定义
很容易的知道二叉搜索树的中序遍历是有序的。
所以,只需在中序遍历的过程中,对每个结点的左右指针作如下操作:
左指针指向它的前一个结点,右指针指向它的后一个结点,将最左端叶子节点作为双向链表的头返回。

3.代码描述

3.1.Java代码

import java.util.*;
/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
/*
以下只是将二叉树的中序遍历模板 更改为合适已有问题的形式。我们都知道二叉树的前、中、后序遍历其实顺序是一样的,都是从根开始走、然后左、然后右。最后回到根。这个过程中每次都会遇到同一//个结点三次,前、中、后序的遍历只是分别在第1、2、3次碰到的时候才去访问该结点。PS:推荐看下浙大陈越姥姥的数据结构课,全是干货,不罗嗦。
*/
    public TreeNode Convert(TreeNode pRootOfTree) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode t = pRootOfTree;
        //用一个指针记录访问结点的前一个结点,因为前一个结点的右指针需要指向当前访问的结点,且当前结点的左指针需要指向前一个结点
        TreeNode pre = null;
        TreeNode head = null;
        boolean isFirst = true;//用一个标记 指示  是否是最左端的叶子结点 
        while(t != null || !stack.isEmpty()){
            while(t != null){
                stack.push(t);
                t = t.left;
            }
            if(!stack.isEmpty()){
                t = stack.pop();
                if(isFirst == true){
                    head = t;
                    pre = t;
                    isFirst = false;
                }
                else{
                    pre.right = t;
                    t.left = pre;
                    pre = t;
                }
                t = t.right;
            }
        }
        return head;
    }
}

3.2.Python代码

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        stack = []
        t = pRootOfTree
        head = None
        pre = None
        isFirst = True
        while t or stack:
            while t:
                stack.append(t)
                t = t.left
            if stack:
                t = stack.pop()
                if isFirst:
                    head = t
                    pre = t
                    isFirst = False
                else:
                    pre.right = t
                    t.left = pre
                    pre = t
                t = t.right
        return head
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值