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