本题为剑指offer面试题27
牛客网测试地址:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5
[编程题]二叉搜索树与双向链表
- 热度指数:51480 时间限制:1秒 空间限制:32768K
- 算法知识视频讲解
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
package go.jacob.day503;
import java.util.Stack;
/**
*
* @author Administrator
* 二叉树中序遍历的应用:二叉搜索树的中序遍历,就可以从小到大输出元素
*/
public class Demo2 {
//head用于记录二叉树中最小的元素,及链表的头结点
TreeNode headNode=null;
//preNode用于记录当前节点的前一节点
TreeNode preNode=null;
public TreeNode Convert(TreeNode pRootOfTree) {
// convert_ruc(pRootOfTree);
convert_cir(pRootOfTree);
return headNode;
}
/*
* 方法一:递归实现
*/
public void convert_ruc(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return;
convert_ruc(pRootOfTree.left);
//找到最左边节点,即最小节点,并记录
if(headNode==null){
headNode=pRootOfTree;
preNode=pRootOfTree;
}else{
preNode.right=pRootOfTree;
pRootOfTree.left=preNode;
preNode=pRootOfTree;
}
convert_ruc(pRootOfTree.right);
}
/*
* 方法二:循环实现
*/
private void convert_cir(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return;
Stack<TreeNode> stack=new Stack<TreeNode>();
while(pRootOfTree!=null||!stack.isEmpty()){
if(pRootOfTree!=null){
stack.push(pRootOfTree);
pRootOfTree=pRootOfTree.left;
}else{
pRootOfTree=stack.pop();
//找到最左边节点,即最小节点,并记录
if(headNode==null){
headNode=pRootOfTree;
preNode=headNode;
}else{
preNode.right=pRootOfTree;
pRootOfTree.left=preNode;
preNode=pRootOfTree;
}
//没有这行代码会引起死循环,思考为什么
pRootOfTree=pRootOfTree.right;
}
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
}