递归代码:递归实现很简单

 '二叉树结点类'
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None '列表创建二叉树'
def listcreattree(root,llist,i):###用列表递归创建二叉树,
#它其实创建过程也是从根开始a开始,创左子树b,再创b的左子树,如果b的左子树为空,返回none。
#再接着创建b的右子树,
if i<len(llist):
if llist[i] =='#':
return None ###这里的return很重要
else:
root=TreeNode(llist[i])
#往左递推
root.left=listcreattree(root.left,llist,2*i+1)#从根开始一直到最左,直至为空,
#往右回溯
root.right=listcreattree(root.right, llist,2*i+2)#再返回上一个根,回溯右,
#回溯到最原始的根,再返回'
return root ###这里的return很重要
return root
#测试
llist=[5,4,3,'#','#',1,2]
root = listcreattree(None,llist,0) '深度优先遍历二叉树'
''' /**
* 深度优先遍历,相当于先根遍历
* 采用非递归实现
* 需要辅助数据结构:栈
*/''' #前序遍历
def preoder(t):
if t == None:
return
print(t.val)
preoder(t.left)
preoder(t.right)
#测试
print('前序遍历:')
preoder(root) #中序遍历
def binoder(t):
if t:
binoder(t.left)
print(t.val)
binoder(t.right)
#测试
print('中序遍历:')
binoder(root) #后序遍历
def pastoder(t):
if t:
pastoder(t.left)
pastoder(t.right)
print(t.val)
#测试
print('后序遍历:')
pastoder(root)

二叉树图:

运行结果:

 前序遍历:
5
4
3
1
2
中序遍历:
4
5
1
3
2
后序遍历:
4
1
2
3
5

非递归实现:以前序遍历为例,基本思想为

(1)由于采取前序遍历,遇到节点就应该访问,下一步应该沿着树的左分支下行。

(2)但节点的右分支(右子树)还没有访问,因此需要记录,将右子结点入栈。

(3)遇到空树时回溯,取出栈中保存的一个右分支,像一棵二叉树一样去遍历它。

递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)的更多相关文章

  1. 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历

    基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...

  2. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  3. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  4. 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归

    Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...

  5. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  6. ZT 二叉树先序,中序,后序遍历非递归实现

    二叉树先序,中序,后序遍历非递归实现 分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报 structc 利用栈实现二叉树的先序,中序,后序遍历的非递归操作 ...

  7. 遍历二叉树 - 基于递归的DFS(前序,中序,后序)

    上节中已经学会了如何构建一个二叉搜索数,这次来学习下树的打印-基于递归的DFS,那什么是DFS呢? 有个概念就行,而它又分为前序.中序.后序三种遍历方式,这个也是在面试中经常会被问到的,下面来具体学习 ...

  8. c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历

    二叉树的创建 思路:数组中从上到下依次放着二叉树中的元素,使用递归很容易实现,那么这里使用容器来存放之前的状态实现循环创建二叉树. TreeNode* createTree(int *arr, int ...

  9. LeetCode二叉树的前序、中序、后序遍历(递归实现)

    本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍 ...

随机推荐

  1. C语言 结构体篇

    结构体:是一种构造类型 它是由若干成员组成的 其中每一个成员都可以是一个基本数据类型或者又是一个构造类型 定义结构体变量后,系统就会为其自动分配内存 为了便于更大的程序便于修改和使用  常常将结构体类 ...

  2. android之Context对各种服务的管理

    经常,当我们须要用到服务的时候能够通果Context来获取:Context.getSystemService(name):比方:当我们想知道当前电话状态(来电/去电/sim卡状态等)时候,我们能够通过 ...

  3. ios 推送证书没有密钥 解决方案【转载】

    注意事项: 1.keychains选择Login 2.2.在创建完CertificateSigningRequest.certSigningRequest可以看到Keys中该有你的私有秘钥 3.按文档 ...

  4. servletResponse 请求重定向

    package response;/* * 重定向特点: * 1,浏览器会向服务器发送两次请求,意味着就有两个request\response * 2,用重定向技术,浏览器地址栏会发生变化 *  * ...

  5. gitlab多人协同工作

    gitlab多人协同工作 本文为亨利向<Git权威指南>的作者蒋鑫老师的答疑邮件写成. 这里特别感谢蒋鑫老师对我询问gitlab的协同工作流程问题的详细解答. 蒋鑫老师的细致专业的解答让我 ...

  6. Rider

    听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider   本文地址:http://www.cnblogs.com/likeli/p/8461010.html 前言 .NET平台的开发一直都只 ...

  7. Python中类方法、__new__方法和__init__方法解析

    在编程语言中创建一个类,有构造方法这样的一个术语.而在Python中,通常大家都认为__init__是构造方法,其实并不完全等同.在构建类中,有一个特殊的方法__new__,这个才能等同为构造方法. ...

  8. php如何在原来的时间上加一天?一小时?

    <?php echo "今天:",date('Y-m-d H:i:s'),"<br>"; echo "明天:",date( ...

  9. android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件

    主要参考<第一行代码> 1.TextView: 功能与传统的桌面应用开发中的Label控件相似,用于显示文本信息 如: <TextView android:layout_width= ...

  10. 【C#图解】PictureBox.SizeMode 属性(转)

    PictureBoxSizeMode.Normal: 默认情况下,在 Normal 模式中,Image 置于 PictureBox 的左上角,凡是因过大而不适合 PictureBox 的任何图像部分都 ...