核心就是中序遍历和辅助节点pre来保存上一个遍历的节点。
先右遍历,再处理节点,后左遍历,这样能返回正序的链表。
public class Solution { TreeNode pre = null; public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null) return null; Convert(pRootOfTree.right); if(pre != null){ pRootOfTree.right = pre; pre.left = pRootOfTree; } pre = pRootOfTree; Convert(pRootOfTree.left); return pre; } }
在力扣上也做了这道题,发现细节处理不一样,但核心还是中序遍历
class Solution { Node pre = null; Node head = null; public Node treeToDoublyList(Node root) { if(root == null) return null; dfs(root); pre.right = head; head.left = pre; return head; } public void dfs(Node root){ if(root == null) return; dfs(root.left); if(pre != null){ root.left = pre; pre.right = root; }else{ head = root; } pre = root; dfs(root.right); } }
这道题定义了两个辅助节点,中序返回来的结果也是倒序的,再处理第一个节点和最后一个节点的关系即可。