6.1 数据结构---树(遍历)

一、树的定义

1.定义

是n(n>=0)个节点的有限集,且这些节点满足如下关系:

(1)有且仅有一个节点没有父节点,该节点称为树的根;

(2)除根外,其余的每个节点都有且仅有一个父节点;

(3)树中的每一个节点都构成一个以它为根的树。

二叉树在满足树的条件时,满足如下条件:每个节点最多有两个孩子(子树),这两个子树有左右之分,次序不可颠倒。

2.树的遍历

二、先序遍历

1.先序遍历

递归

非递归:时间复杂度O(n),空间复杂度O(n)

思路:

1)申请一个新的栈,把头结点压入栈中
2)从栈中弹出栈顶节点,记为node,然后打印node节点的值,再将节点node的由孩子先压入stack中,最后将node的左孩子压入stack中
3)不断重复步骤2,直到栈为空,过程结束

2.左叶子之和

leetcode 404

3.判断一棵树是不是平衡树

4.复制二叉树

5.求二叉树的所有叶子节点,并且判断两棵二叉树的叶子节点是否相等

思路1:用先序遍历按左到右顺序遍历所有叶子节点,并返回,然后判断两棵树的叶子序列是否相等。

时间复杂度O(T1+T2)  空间复杂度O(T1+T2)

思路2:dfs

  

三、中序遍历

1.中序遍历

递归:时间复杂度O(n),空间复杂度平均O(logn),最坏情况下O(n)

非递归:时间复杂度O(n),空间复杂度O(n)

思路:

1)申请一个新的栈,初始时,令变量node=head
2)先把node节点压入栈中,对以node节点为头的整棵子树来说,依次把左边界压入栈中,即不停的令node=node.left,然后重复步骤2
3)不断重复步骤2,直到发现node为空,此时,从栈中弹出一个节点,记为node,打印node的值,并且让node=node.right,然后继续重复步骤2
4)当stack为空且cur为空时,整个过程停止.

2.判断一棵树是不是二叉搜索树

3.在二叉排序树中找出第一个大于中间值的借贷

4.二叉树转换为双向链表

 

四、后序遍历

1.后序遍历

递归:时间复杂度O(n),空间复杂度平均O(logn),最坏情况下O(n)

非递归

a.两个栈:时间复杂度O(n),空间复杂度O(n)

思路:用两个栈实现后序遍历
1)申请一个栈,记为s1,然后将头结点head压入栈Ss1中;
2)从s1中弹出的节点记为cur,然后依次将cur的左孩子和右孩子压入s1中;
3)从整个过程中,每一个从s1中弹出的节点都放进s2中;
4)不断重复步骤2和步骤3,直到s1为空,过程停止;
5)从s2中依次弹出节点并打印,打印的顺序就是后序遍历的顺序.

b.一个栈

思路:用一个栈实现后序遍历
申请一个栈,将头结点压入栈中,同时设置变量h和c,h代表最近一次弹出并打印的节点,c代表stack的栈顶节点,初始时h为头结点,c为null

2.二叉树的最小深度

leetcode 111

3.判断一个数组是否是二元查找树后序遍历的序列

4.对二叉树进行镜像反转

5.求二叉树的最大子树和

 

五、层次遍历

1.层次遍历

递归

思路:每次遍历到新层,层数+1,

非递归

思路:用一个队列记录

2.二叉树的锯齿形层次遍历 leetcode103

3.二叉树自底向上层次遍历

4.判断一棵树是不是二叉完全树

5.找树左下角的值 leetcode153

思想:层次遍历找最后一层的第一个节点的值

  

 

 

六、给定二叉树前、中序遍历,构造二叉树

分析:

  前序遍历序列第一个是根节点x

  从中序遍历序列中找到根节点x

  中序遍历中x的左边序列对应等长的前序遍历序列【左子树】

  中序遍历中的x的右边序列对应等长的前序遍历序列【右子树】

 

七、给定二叉树中、后序遍历,构造二叉树

  

 

 

 

 

 

posted @   nxf_rabbit75  阅读(478)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
一、树的定义1.定义2.树的遍历二、先序遍历1.先序遍历2.左叶子之和3.判断一棵树是不是平衡树4.复制二叉树5.求二叉树的所有叶子节点,并且判断两棵二叉树的叶子节点是否相等三、中序遍历1.中序遍历2.判断一棵树是不是二叉搜索树3.在二叉排序树中找出第一个大于中间值的借贷4.二叉树转换为双向链表四、后序遍历1.后序遍历2.二叉树的最小深度3.判断一个数组是否是二元查找树后序遍历的序列4.对二叉树进行镜像反转5.求二叉树的最大子树和五、层次遍历1.层次遍历2.二叉树的锯齿形层次遍历 leetcode1033.二叉树自底向上层次遍历4.判断一棵树是不是二叉完全树5.找树左下角的值 leetcode153六、给定二叉树前、中序遍历,构造二叉树七、给定二叉树中、后序遍历,构造二叉树 
点击右上角即可分享
微信分享提示