【leetcode】145.(Hard)Binary Tree Postorder Traversal
阿新 • • 發佈:2018-12-18
解題思路:
morris後序遍歷
這篇部落格的程式碼挺好的:
https://blog.csdn.net/zuochao_2013/article/details/78538729
時間複雜度:O(n)
morris演算法會遍歷每個節點的左子樹的右邊界兩次,所有的右邊界加起來是所有的結點數,所以耗時O(2*n)=O(n)。
空間複雜度:O(1)
提交程式碼:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res= new ArrayList<>();
if(root==null) return res;
TreeNode dummyHead=new TreeNode(-1);
dummyHead.left=root;
dummyHead.right=null;
TreeNode p,cur=dummyHead;
while(cur!=null) {
if(cur.left!=null) {
p=cur.left;
while(p.right!=null&& p.right!=cur)
p=p.right;
if(p.right==null) {
p.right=cur;
cur=cur.left;
continue;
}else {
p.right=null;
TreeNode tmp=reverse(cur.left);
addNode(res,tmp);
}
}
cur=cur.right;
}
return res;
}
public TreeNode reverse(TreeNode cur) {
TreeNode pre=null;
TreeNode next=null;
while(cur!=null) {
next=cur.right;
cur.right=pre;
pre=cur;
cur=next;
}
return pre;
}
public void addNode(List<Integer> res,TreeNode head) {
TreeNode p=head;
while(p!=null) {
res.add(p.val);
p=p.right;
}
}
}
執行結果: