JZ26-二叉搜索树与双向链表
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tags=&title=&diffculty=0&judgeStatus=0&rp=1&tab=answerKey
class Solution {
ArrayList<TreeNode> list = new ArrayList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return pRootOfTree;
}
inOrder(pRootOfTree);
reBuild();
return list.get(0);
}
//中序遍历
public void inOrder(TreeNode pRootOfTree) {
Stack<TreeNode> stack = new Stack<>();
stack.push(pRootOfTree);
while (!stack.isEmpty()) {
if (pRootOfTree.left != null) {
stack.push(pRootOfTree.left);
pRootOfTree = pRootOfTree.left;
} else {
TreeNode temp = stack.pop();
list.add(temp);
if (temp.right != null) {
stack.push(temp.right);
pRootOfTree = temp.right;
}
}
}
}
//重建
public void reBuild() {
for (int i = 0; i < list.size() - 1; i++) {
list.get(i).right = list.get(i + 1);
list.get(i + 1).left = list.get(i);
}
}
}
class Solution2 {
TreeNode pre = null;
TreeNode root = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
Convert(pRootOfTree.left);
if (root == null) {
root = pRootOfTree;
}
if (pre != null) {
pRootOfTree.left = pre;
pre.right = pRootOfTree;
}
pre = pRootOfTree;
Convert(pRootOfTree.right);
return root;
}
}
class Solution3 {
public static TreeNode convert(TreeNode root) {
//指向双向链表的尾节点
TreeNode lastNode = convertNode(root, null);
//找到转换后的链表的头节点
TreeNode pHead = lastNode;
while (pHead != null && pHead.left != null) {
pHead = pHead.left;
}
//返回链表头节点
return pHead;
}
public static TreeNode convertNode(TreeNode root, TreeNode lastNode) {
if (root == null) {
return null;
}
TreeNode current = root;
//递归处理左子树
if (current.left != null) {
lastNode = convertNode(current.left, lastNode);
}
//将当前节点的左指针指向已经转换好的链表的最后一个位置
current.left = lastNode;
//将已经转换好的链表的最后一个节点的右指针指向当前节点
if (lastNode != null) {
lastNode.right = current;
}
//更新已经转换好的链表的最后一个节点
lastNode = current;
//递归处理右子树
if (current.right != null) {
lastNode = convertNode(current.right, lastNode);
}
return lastNode;
}
} 