题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
知识点:
1、二叉搜索树:左节点的值<根节点的值<右节点的值
2、中序遍历:左节点->根->右节点
思路:
对二叉搜索树进行中序遍历,使结点排序,再进行结点链的转换。
二叉搜索树的中序遍历:
public Stack<TreeNode> midTree(TreeNode root,Stack<TreeNode> s){
if(root == null) return null;
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.empty()){
while(root != null){//查找到最左边的子节点(也就是搜索树中值最小的结点)
stack.push(root);
root = root.left;
}
root = stack.pop();//记录每个根节点
s.push(root);//此栈中记录值从小到大排序的结点
root = root.right;
}
return s;
}
答案:
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 {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){return null;}
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode p1 = pRootOfTree;
s = midTree(pRootOfTree,s);//此栈中记录值从小到大排序的结点
p1 = s.pop();//值最大的结点
while(!s.isEmpty()){//遍历所有的结点
p1.left = s.pop();//left为向后指
p1.left.right = p1;//right为向前指
p1 = p1.left;//向后移节点
}
return p1;//p1指向值最小的结点
}
public Stack<TreeNode> midTree(TreeNode root,Stack<TreeNode> s){
if(root == null) return null;
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.empty()){
while(root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
s.push(root);
root = root.right;
}
return s;
}
}