原題地址:http://oj.leetcode.com/problems/binary-tree-inorder-traversal/
題意:二叉樹的中序遍歷。這道題用遞歸比較簡單,考察的是非遞歸實現二叉樹中序遍歷。中序遍歷順序為:左子樹,根,右子樹。如此遞歸下去。
解題思路:假設樹為:
1
/ \
2 3
/ \ / \
4 5 6 7
我們使用一個棧來解決問題。步驟如下:
一,我們將根節點1入棧,如果有左孩子,依次入棧,那么入棧順序為:1,2,4。由於4的左子樹為空,停止入棧,此時棧為{1,2,4}。
二,此時將4出棧,並遍歷4,由於4也沒有右孩子,那么根據中序遍歷的規則,我們顯然應該繼續遍歷4的父親2,情況是這樣。所以我們繼續將2出棧並遍歷2,2存在右孩子,將5入棧,此時棧為{1,5}。
三,5沒有孩子,則將5出棧並遍歷5,這也符合中序遍歷的規則。此時棧為{1}。
四,1有右孩子,則將1出棧並遍歷1,然后將右孩子3入棧,並繼續以上三個步驟即可。
棧的變化過程:{1}->{1,2}->{1,2,4}->{1,2}->{1}->{1,5}->{1}->{}->{3}->{3,6}->{3}->{}->{7}->{}。
代碼:
# Definition for a binary tree node # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # @param root, a tree node # @return a list of integers def iterative_inorder(self, root, list): stack = [] while root or stack: if root: stack.append(root) root = root.left else: root = stack.pop() list.append(root.val) root = root.right return list def recursive_inorder(self, root, list): if root: self.inorder(root.left, list) list.append(root.val) self.inorder(root.right, list) def inorderTraversal(self, root): list = [] self.iterative_inorder(root, list) return list