1. 程式人生 > >【leetcode】145.(Hard)Binary Tree Postorder Traversal

【leetcode】145.(Hard)Binary Tree Postorder Traversal

解題思路:
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; } } }

執行結果:
在這裡插入圖片描述