剑指 offer 面试题36 二叉搜索树与双向链表(递归中序遍历)
程序员文章站
2024-03-18 10:43:22
...
二叉搜索树与双向链表
题解
-
中序遍历
-
算法思想
-
二叉搜索树的中序遍历序列是节点从小到大的顺序
-
在遍历的过程中记录上一次遍历的节点,此次遍历将本节点的左子节点指向上一个节点,将上一个节点的右子节点指向本节点,这样就完成了连接
-
特殊情况:
- 遍历第一个节点的时候,pre 是 null,所以需要判断 pre 是否为 null
- 如果为 null,则将此节点记录为 head 节点
- 遍历第一个节点的时候,pre 是 null,所以需要判断 pre 是否为 null
-
-
复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(n):最坏情况下,树退化为链表,队规深度达到 N,使用 O(n)的额外空间
/* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) { val = _val; } public Node(int _val,Node _left,Node _right) { val = _val; left = _left; right = _right; } }; */ class Solution { Node pre,head; public Node treeToDoublyList(Node root) { if(root == null)return null; dfs(root); head.left = pre; pre.right = head; return head; } void dfs(Node cur){ if(cur == null)return; dfs(cur.left); if(pre == null)head = cur; else pre.right = cur; cur.left = pre; pre = cur; dfs(cur.right); } }
-
总结
- 中序遍历序列是从小到大的顺序排列的,但是我没有办法想到可以通过这个性质将节点按照排序连接起来。为什么自己的联想能力不足?是因为性质还不够内化?对递归还不够熟悉吗?(这里比较重要的一个点是这些中序遍历的序列中的每一个节点都是可以操作的,而不仅仅是个数字)
- 为什么可以想到用一个变量记录之前遍历的节点?巧妙的完成了连接。