首页 > 代码库 > Morris Traversal: 非递归不用栈实现对树的中序遍历

Morris Traversal: 非递归不用栈实现对树的中序遍历

参考:http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/

<pre name="code" class="plain">1. Initialize current as root 
2. While current is not NULL
   If current does not have left child
      a) Print current’s data
      b) Go to the right child, i.e., current = current->right
   Else
      a) Make current as right child of the rightmost node in current's left subtree
      b) Go to this left child, i.e., current = current->left
When we do 2.Else, for the first round it will execute 2.Else.a/b. When finish the steps and return back,we check again and reset the rightmost node in current's left subtree as null. That is the following statement:
      a') Find the rightmost node in current's left subtree (its right child is current) and set its right child as null
      b') Go to the right child

        cur = root
        while cur is not None:
            if cur.left is None:
                cur = cur.right
            else:
                ptr = cur.left
                while ptr.right != None and ptr.right != cur:
                    ptr = ptr.right
                if ptr.right == None:    //Else a/b, the rightmost node in current's left subtree
                    ptr.right = cur
                    cur = cur.left
                else:                    //Else a'/b', restore the right child of the right most node in current's left subtree
                    ptr.right = None
                    cur = cur.right


题目举例:

https://oj.leetcode.com/problems/recover-binary-search-tree/

https://oj.leetcode.com/problems/validate-binary-search-tree/


# 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 boolean
    def isValidBST(self, root):
        ans = True
        pre,cur = None,root
        while cur is not None:
            if cur.left is None:
                pre = cur
                cur = cur.right
            else:
                ptr = cur.left
                while ptr.right != None and ptr.right != cur:
                    ptr = ptr.right
                if ptr.right == None:
                    ptr.right = cur
                    cur = cur.left
                else:
                    ptr.right = None
                    pre = cur
                    cur = cur.right
            if pre != None and cur != None:
                if pre.val >= cur.val:
                    ans = False
        return ans


Morris Traversal: 非递归不用栈实现对树的中序遍历