深度优先前序遍历二叉树代码
时间: 2024-04-26 12:18:21 浏览: 82
深度优先前序遍历二叉树是一种常用的遍历方式,它的代码实现如下:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def preorderTraversal(root):
if root is None:
return []
stack = [root]
result = []
while stack:
node = stack.pop()
result.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return result
```
上述代码中,我们使用了一个栈来辅助实现深度优先前序遍历。首先,我们将根节点入栈。然后,从栈中弹出一个节点,将其值加入结果列表中,并依次将右子节点和左子节点入栈。重复这个过程,直到栈为空。
相关问题
1、二叉树的建立 2、前序遍历二叉树 3、中序遍历二叉树 4、后序遍历二叉树 5、按层序遍历二叉树 6、求二叉树的深度 7、求指定结点到根的路径 8、二叉树的销毁
好的,我明白了,以下是对应问题的回答:
1、二叉树的建立:
二叉树的建立可以采用递归或非递归方式。递归方式比较简单,对于每个节点,先创建一个节点,然后递归地创建它的左右子树。非递归方式一般使用栈,先将根节点入栈,然后循环执行以下操作:取出栈顶节点,读入它的左右子树(如果有的话),并将它们入栈。直到栈为空为止。
2、前序遍历二叉树:
前序遍历二叉树的顺序是:先访问根节点,然后访问左子树,最后访问右子树。实现方式可以采用递归或非递归方式。
3、中序遍历二叉树:
中序遍历二叉树的顺序是:先访问左子树,然后访问根节点,最后访问右子树。实现方式可以采用递归或非递归方式。
4、后序遍历二叉树:
后序遍历二叉树的顺序是:先访问左子树,然后访问右子树,最后访问根节点。实现方式可以采用递归或非递归方式。
5、按层序遍历二叉树:
按层序遍历二叉树的顺序是:从上到下、从左到右依次访问所有节点。实现方式可以采用队列,先将根节点入队,然后循环执行以下操作:取出队头节点,访问它的左右子节点(如果有的话),并将它们入队。直到队列为空为止。
6、求二叉树的深度:
求二叉树的深度可以采用递归方式。对于每个节点,它的深度等于左右子树深度的较大值再加1。如果节点为空,则深度为0。
7、求指定结点到根的路径:
求指定结点到根的路径可以采用递归方式。对于每个节点,如果它是目标节点或者目标节点的祖先节点,则将它加入路径中。如果节点为空,则返回空路径。
8、二叉树的销毁:
二叉树的销毁可以采用递归方式。对于每个节点,先销毁它的左右子树,然后再销毁它本身。如果节点为空,则直接返回。
根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。 二叉树的基本功能 ① 二叉树的建立; ② 前序遍历二叉树; ③ 中序遍历二叉树; ④ 后序遍历二叉树; ⑤ 按层序遍历二叉树 ⑥ 求二叉树的深度; ⑦
二叉树的链式存储结构可以使用一个结构体来表示二叉树的节点,每个节点包含一个数据域和两个指针域指向左子树和右子树。建立二叉树时,可以采用递归的方法,先建立左子树,再建立右子树。
下面是使用 C 语言实现二叉树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 建立二叉树
void createTree(TreeNode **root) {
int val;
scanf("%d", &val);
if (val == -1) { // 输入 -1 表示该节点为空
*root = NULL;
} else {
*root = (TreeNode *) malloc(sizeof(TreeNode));
(*root)->data = val;
createTree(&((*root)->left));
createTree(&((*root)->right));
}
}
// 前序遍历二叉树
void preOrder(TreeNode *root) {
if (root != NULL) {
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
}
// 中序遍历二叉树
void inOrder(TreeNode *root) {
if (root != NULL) {
inOrder(root->left);
printf("%d ", root->data);
inOrder(root->right);
}
}
// 后序遍历二叉树
void postOrder(TreeNode *root) {
if (root != NULL) {
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->data);
}
}
// 按层序遍历二叉树
void levelOrder(TreeNode *root) {
if (root == NULL) return;
TreeNode *queue[100];
int front = 0, rear = 0;
queue[rear++] = root;
while (front < rear) {
TreeNode *node = queue[front++];
printf("%d ", node->data);
if (node->left != NULL) queue[rear++] = node->left;
if (node->right != NULL) queue[rear++] = node->right;
}
}
// 求二叉树的深度
int depth(TreeNode *root) {
if (root == NULL) return 0;
int leftDepth = depth(root->left);
int rightDepth = depth(root->right);
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
int main() {
TreeNode *root = NULL;
printf("请输入二叉树的节点,-1表示该节点为空:\n");
createTree(&root);
printf("前序遍历结果:");
preOrder(root);
printf("\n中序遍历结果:");
inOrder(root);
printf("\n后序遍历结果:");
postOrder(root);
printf("\n按层序遍历结果:");
levelOrder(root);
printf("\n二叉树的深度:%d\n", depth(root));
return 0;
}
```
以上代码实现了二叉树的建立、前序遍历、中序遍历、后序遍历、按层序遍历和求深度功能。
阅读全文