[leetcode]Binary Tree Inorder Traversal @ Python


原題地址: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM