二叉搜索树和双向链表
1.
2.
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null && pRootOfTree.right==null)
return pRootOfTree;
// 1.将左子树构造成双链表,并返回链表头节点
TreeNode left = Convert(pRootOfTree.left);
TreeNode p = left;
// 2.遍历至左子树双链表最后一个节点
while(p!=null&&p.right!=null){
p = p.right;
}
// 3.如果左子树链表不为空的话,将当前root追加到左子树链表
if(left!=null){
p.right = pRootOfTree;
pRootOfTree.left = p;
}
// 4.将右子树构造成双链表,并返回链表头节点
TreeNode right = Convert(pRootOfTree.right);
// 5.如果右子树链表不为空的话,将该链表追加到root节点之后
if(right!=null){
right.left = pRootOfTree;
pRootOfTree.right = right;
}
return left!=null?left:pRootOfTree;
}
}
3.
import java.util.Stack;
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
TreeNode p = pRootOfTree;
TreeNode pre = null;
boolean isFirst = true;
Stack<TreeNode> stack=new Stack<TreeNode>();
while(!stack.isEmpty()||p!=null){
if(p!=null){
stack.push(p);
p=p.left;
}
else{
p=stack.pop();
if(isFirst){
isFirst=false;
pRootOfTree=p;
pre=p;
}else{
pre.right=p;
p.left=pre;
pre=p;
}
p=p.right;
}
}
return pRootOfTree;
}
}
4.
public static TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
TreeNode p = pRootOfTree;
TreeNode pre = null;
boolean isFirst = true;
Stack<TreeNode> stack=new Stack<TreeNode>();
while(!stack.isEmpty()||p!=null){
if(p!=null){
stack.push(p);
p=p.left;
}
else {
p = stack.pop();
if (isFirst) {
isFirst = false;
pRootOfTree = p;
pre = p;
} else {
pre.right = p;
p.left = pre;
pre = p;
}
p = p.right;
}
}
return pRootOfTree;
}