创建如下的二叉树。用栈完成二叉树的先序遍历。通过递归的方式求此二叉树的叶子节点个数与深度。
时间: 2023-04-22 07:01:35 浏览: 108
二叉树:
```
1
/ \
2 3
/ \ / \
4 5 6 7
```
先序遍历结果为:1 2 4 5 3 6 7
递归求叶子节点个数为:4,深度为:3
相关问题
请写出二叉树非递归遍历算法的先序遍历、中序遍历、后序遍历的伪代码,递归遍历算法 的先序遍历、中序遍历、后序遍历的伪代码,层次遍历算法的伪代码,求树深的伪代码,求叶子节点数的伪代码,求节点数的伪代码。
好的,下面是关于二叉树遍历和统计的伪代码:
1. 二叉树非递归遍历算法
(1)先序遍历
```
非递归先序遍历二叉树(root为二叉树根节点):
1. 创建一个栈stack,将root节点入栈;
2. 当栈不为空时,取出栈顶元素,输出其值;
3. 如果该元素的右子树不为空,则将其右子树入栈;
4. 如果该元素的左子树不为空,则将其左子树入栈;
5. 重复步骤2~4,直到栈为空为止。
```
(2)中序遍历
```
非递归中序遍历二叉树(root为二叉树根节点):
1. 创建一个栈stack,将root节点入栈;
2. 当栈不为空时,取出栈顶元素,如果该元素的左子树为空或者左子树已经被访问过了,则输出该节点的值,并将其右子树入栈;
3. 如果该元素的左子树不为空,则将其左子树入栈;
4. 重复步骤2~3,直到栈为空为止。
```
(3)后序遍历
```
非递归后序遍历二叉树(root为二叉树根节点):
1. 创建一个栈stack,将root节点入栈;
2. 创建一个标志位变量,初始值为null;
3. 当栈不为空时,取出栈顶元素,如果该元素的左右子树都为空,或者其左右子树已经被访问过了,则输出该节点的值,并将标志位变量设为该节点;
4. 如果该元素的右子树不为空且右子树未被访问过,则将其右子树入栈;
5. 如果该元素的左子树不为空且左子树未被访问过,则将其左子树入栈;
6. 如果该元素的左右子树都不为空且左右子树都已经被访问过了,则输出该节点的值,并将标志位变量设为该节点;
7. 重复步骤3~6,直到栈为空为止。
```
2. 二叉树递归遍历算法
(1)先序遍历
```
递归先序遍历二叉树(root为二叉树根节点):
1. 如果root节点为空,直接返回;
2. 输出root节点的值;
3. 递归遍历root节点的左子树;
4. 递归遍历root节点的右子树。
```
(2)中序遍历
```
递归中序遍历二叉树(root为二叉树根节点):
1. 如果root节点为空,直接返回;
2. 递归遍历root节点的左子树;
3. 输出root节点的值;
4. 递归遍历root节点的右子树。
```
(3)后序遍历
```
递归后序遍历二叉树(root为二叉树根节点):
1. 如果root节点为空,直接返回;
2. 递归遍历root节点的左子树;
3. 递归遍历root节点的右子树;
4. 输出root节点的值。
```
3. 二叉树层次遍历算法
```
层次遍历二叉树(root为二叉树根节点):
1. 将root节点入队列;
2. 当队列不为空时,取出队首元素,输出其值;
3. 如果该元素的左子树不为空,则将其左子树入队列;
4. 如果该元素的右子树不为空,则将其右子树入队列;
5. 重复步骤2~4,直到队列为空为止。
```
4. 求树深
```
求二叉树深度(root为二叉树根节点):
1. 如果root节点为空,返回0;
2. 分别递归求左子树和右子树的深度,取其中较大值,加1即为该二叉树的深度。
```
5. 求叶子节点数
```
求二叉树叶子节点数(root为二叉树根节点):
1. 如果root节点为空,返回0;
2. 如果root节点的左右子树都为空,返回1;
3. 分别递归求左子树和右子树的叶子节点数,将其相加即为该二叉树的叶子节点数。
```
6. 求节点数
```
求二叉树节点数(root为二叉树根节点):
1. 如果root节点为空,返回0;
2. 分别递归求左子树和右子树的节点数,将其相加,再加1即为该二叉树的节点数。
```
以上就是关于二叉树遍历和统计的伪代码。
遍写程序,非递归算法实现对二叉树的先序遍历。 按先序序列建立二叉树的二叉链表(用#补齐空结点),然后借助栈对二叉树进行非递归方式的先序遍历,并输出遍历结果。,使用c++实现并给出代码
数组表示)如下: A B D # # # C # # 其中,#表示空结点。非递归算法实现对此二叉树的先序遍历,步骤如下:
1. 定义一个栈,将根节点入栈。
2. 循环执行以下操作:
a. 弹出栈顶节点,输出该节点的值。
b. 如果该节点有右子节点,则将右子节点入栈。
c. 如果该节点有左子节点,则将左子节点入栈。
d. 如果栈空,则结束循环。
具体代码实现如下:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def preorderTraversal(root: TreeNode) -> List[int]:
stack = []
output = []
if not root:
return output
stack.append(root)
while stack:
node = stack.pop()
output.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return output
```
其中,TreeNode为二叉树节点的定义,preorderTraversal函数实现了二叉树的先序遍历。
阅读全文