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; } }