码迷,mamicode.com
首页 > 其他好文 > 详细

【二叉树】二叉树的非递归遍历

时间:2014-11-17 15:30:06      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   使用   sp   for   数据   div   

【题目】不使用递归,对二叉树进行先序、中序和后序遍历
【思路】利用栈
先序:
1. 输出当前结点
2. 把右孩子放到栈中
3. 当前指针指向左孩子
4. 重复1-3,直到叶子结点
5. 如果栈不空,则从栈里POP出一个结点,赋值给当前节点
6. 重复1-5
 
 
中序:
1. 如果当前节点不为空,把当前节点PUSH
2. 当前节点指向左孩子
3. 如果当前节点为空,POP,并打印,把右节点设为当前节点
 
 
后序
用2个栈
1. 如果当前节点不为空,把当前节点PUSH左栈,并把当前节点指向其左孩子
2. 如果当前节点为空,左栈顶和右栈顶相同,则输出栈顶元素
    不相同,则当前节点为左栈的右节点,右栈PUSH左栈顶的元素
 
【代码】
基本数据结构:
1 class G:
2     def evaluate(self, l, r, v):
3         self.left = l
4         self.right =r
5         self.val = v

 

构建测试数据:

 1 tree = [G() for i in xrange(9)]
 2 tree[8].evaluate(None, None, 8)
 3 tree[7].evaluate(None, None, 7)
 4 tree[6].evaluate(None, None, 6)
 5 tree[5].evaluate(None, None, 5)
 6 tree[4].evaluate(tree[7], tree[8], 4)
 7 tree[3].evaluate(None, None, 3)
 8 tree[2].evaluate(tree[5], tree[6], 2)
 9 tree[1].evaluate(tree[3], tree[4], 1)
10 tree[0].evaluate(tree[1], tree[2], 0)

 

先序遍历:

 1 def preOrder(t): 
 2     p = t
 3     stack = []
 4     rslt = []
 5     while p or stack:
 6        if p:
 7           rslt.append(p.val)
 8           stack.append(p.right)
 9           p = p.left
10        else:
11           p = stack.pop()
12     print rslt

 

中序遍历:

 1 def inOrder(t): 
 2     p = t
 3     stack = []
 4     rslt = []
 5     while p or stack:
 6         if p:
 7             stack.append(p)
 8             p = p.left
 9         else:
10             s = stack.pop()
11             rslt.append(s.val)
12             p = s.right
13     print rslt

 

后序遍历:

 1  def postOrder(t):
 2          p = t
 3          leftStack = []
 4          rightStack = []
 5          rslt = []
 6          while (p or leftStack or rightStack):
 7              if p:
 8                  leftStack.append(p)
 9                  p = p.left
10              elif leftStack and rightStack and leftStack[-1] == rightStack[-1]:
11                  leftStack.pop().val
12                  rslt.append(rightStack.pop().val)
13              else:
14                  rightStack.append(leftStack[-1])
15                  p = leftStack[-1].right
16          print rslt

 

 

【二叉树】二叉树的非递归遍历

标签:style   blog   color   os   使用   sp   for   数据   div   

原文地址:http://www.cnblogs.com/pypot/p/4103543.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!