JZ26 二叉搜索树和双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
题解
1. 非递归
思路
模拟二叉树的中序遍历,在遍历时记录前驱节点,将中序遍历打印节点的操作改为转换节点指针指向。
注意:对第一个节点和其前驱节点不进行调整,会出现空指针异常
代码
import java.util.Stack;
/**
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;
TreeNode prev = null;
Stack<TreeNode> stack = new Stack();
TreeNode node = pRootOfTree;
while(node != null || !stack.isEmpty()){
while(node != null){
stack.push(node);
node = node.left;
}
node = stack.pop();
if(prev == null){//记录第一个节点
pRootOfTree = node;
}else{
prev.right = node;
node.left = prev;
}
prev = node;
node = node.right;
}
return pRootOfTree;
}
}
2. 递归
思路
模拟二叉树的中序遍历,在遍历时记录前驱节点,将中序遍历打印节点的操作改为转换节点指针指向。
注意:对第一个节点和其前驱节点不进行调整,会出现空指针异常
代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode prev = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null)
return null;
//调整指针指向方法
ConvertBase(pRootOfTree);
//找链表第一个节点
TreeNode node = pRootOfTree;
while(node.left != null){
node = node.left;
}
return node;
}
public void ConvertBase(TreeNode node) {
if(node == null) return;
//调整左子树
Convert(node.left);
//调整当前节点指针指向
if(prev != null){
prev.right = node;
node.left = prev;
}
prev = node;
//调整右子树
Convert(node.right);
}
}