使用遞迴遍歷二叉樹,已經不能熟的不能再熟了,同時還有不少問題可以用到遞迴的方法去求解。本文的重點不是遞迴遍歷二叉樹。
遞迴的方法是jvm為我們的方法呼叫隱式的準備了乙個filo的棧,迭代的形式就是手動維護乙個棧。
class solution
return ans;}}
中序遍歷,要先找到最最左邊的葉子節點,彈出時又要分叉向該葉子節點的右子節點遍歷,所以形式如下
class solution
root = stack.pop();
ans.add(root.val);
root = root.right;
}return ans;}}
後續遍歷應該是迭代遍歷中最難理解的了
觀察一下前序遍歷的順序:中->左->右,同時後續遍歷的順序:左->右->中,
如果我們遍歷二叉樹的時候先採用 中->右->左 的順序,然後再反轉一下順序,就可以得到 左->右->中 的順序。
ps:此題目中是採用乙個list來新增節點,如果只是單單列印的話利用這種方法我還真不知道怎麼寫,需要另外
再看一下其他**。
需要注意的是**中並沒有使用colletions.reverse()方法反轉list,而是採用雙向鍊錶的ans.addfirst()方法在過程中實現反轉。
class solution
return ans;}}
重頭戲來了,莫里斯(morris)方法
講一下先學習的morris中序遍歷
前面的遞迴和迭代,本質都是用到了棧這個資料結構,因此時間複雜度和空間複雜度都會是o(n),空間複雜度是不可避免的,而morris遍歷直接在二叉樹上面改動,讓二叉樹在過程中變成了乙個鍊錶。其實morris遍歷和線索化煉表有點像。目前做過的有劍指 offer 36. 二叉搜尋樹與雙向鍊錶
例如這個二叉樹:
如圖所示,當前指向4這個節點,若它的左子節點不為空,則即為left,若為空則處理該節點;若有left,則一直找到left的最右最右子節點,若能找到則記為pre,再讓pre.right = cur,在cur = cur.left時,消除cur 與 left 節點的連線,這樣處理之後,就慢慢向鍊錶變化了。
//將root指向root的left
treenode tmp = root;
root = root.left;
tmp.left = null;
//左子樹為空,則列印這個節點,並向右邊遍歷
} else
} return res;
}}
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
二叉樹遍歷
二叉樹的遍歷非常重要,但對已一棵比較複雜的樹,要寫出它的先 中 後序遍歷,往往不是那麼簡單,也很容易犯錯。這裡介紹一種比較直觀且不容易犯錯的方法。對於圖1所示的二叉樹,要寫出它的先 中 後序遍歷,往往很容易出錯。圖 1 其實,我們可以用圖2中的紅線描畫出二叉樹的輪廓。圖 2 而對於樹上的每乙個節點,...
二叉樹遍歷
描述 華為實習生招聘,有一道類似如下的題目 給出二叉樹,如圖1所示 圖 1 二叉樹 要求給出中序遍歷的結果。下面分別就前序遍歷 中序遍歷 後序遍歷進行分析。規律 前序遍歷 根在前 子樹在根後且左子樹比右子樹靠前 中序遍歷 根在中 左子樹在根左邊,右子樹在根右邊 後序遍歷 根在後 子樹在根前且左子樹比...