二叉树深度优先遍历-递归实现

article/2025/11/10 2:02:41

二叉树深度优先遍历的递归实现

  • 一、深度优先遍历
  • 二、先序遍历
    • 1.算法思路
    • 2.代码实现
  • 三、中序遍历
    • 1.算法思路
    • 2.代码实现
  • 四、后序遍历
    • 1.算法思路
    • 2.代码实现

一、深度优先遍历

对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。
要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历、中序遍历、后序遍历。具体说明如下:
先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树。即:根、左、右
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树。即:左、根、右
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。即:左、右、根
注:二叉树的具体构建详见此篇文章

二、先序遍历

1.算法思路

先序遍历就是在访问二叉树的结点的时候采用,先根,再左,再右的方式。
在这里插入图片描述
上图所示二叉树先序遍历即为:ABDGHCEIF
实现先序遍历思路非常简单,只需要巧妙的利用“递归”即可:

//树的先序遍历 Preorder traversal
void preorder(Node* node){if (node != NULL) {printf("%d ",node->data); // 根preorder(node->left); // 左子树preorder(node->right); // 右子树}
}

2.代码实现

// 先序遍历let preorderArr = [] // 存放遍历结果的数组function preorder(node) {if (node) {preorderArr.push(node.data);preorder(node.lChild);preorder(node.rChild);}}preorder(tree);console.log(preorderArr);

运行结果:
在这里插入图片描述

三、中序遍历

1.算法思路

中序遍历就是在访问二叉树的结点的时候采用,先左,再根,再右的方式。
在这里插入图片描述
上图所示二叉树中序遍历即为:GDHBAEICF
巧妙利用递归,与先序的代码只有一个顺序的区别:

//树的中序遍历 In-order traversal
void inorder(Node* node){if (node != NULL){inorder(node->left);printf("%d ",node->data);inorder(node->right);}
}

2.代码实现

// 中序遍历let inorderArr = []function inorder(node) {if (node) {inorder(node.lChild); // 左子树inorderArr.push(node.data); // 根inorder(node.rChild); // 右子树}}inorder(tree)console.log(inorderArr);

运行结果:
在这里插入图片描述

四、后序遍历

1.算法思路

后序遍历就是在访问二叉树的结点的时候采用,先左,再右,再根的方式。
在这里插入图片描述
上图所示二叉树后序遍历即为:GHDBIEFCA
巧妙利用递归,与先序的代码只有一个顺序的区别:

//树的中序遍历 In-order traversal
void inorder(Node* node){if (node != NULL){inorder(node->left);inorder(node->right);printf("%d ",node->data);}
}

2.代码实现

// 后序遍历let postorderArr = []function postorder(node) {if (node) {postorder(node.lChild); // 左子树postorder(node.rChild); // 右子树postorderArr.push(node.data); // 根}}postorder(tree)console.log(postorderArr);

运行结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/gLNvSSsK.shtml

相关文章

二叉树深度和高度_二叉树的高度和深度

二叉树深度和高度 In this tutorial, we will learn how to find height and depth of binary tree with program implementation in C++. It is one of the most commonly used non-linear data structures. We will learn about: 在本教程中,我们将学习如何使用C ++中的程序…

【数据结构】计算二叉树深度完整C语言代码

【数据结构】二叉树深度的计算 二叉树的深度计算完整代码展示程序结果 二叉树的深度计算 我们先看一个深度为3的二叉树。想求得此二叉树深度,先计算左孩子深度,再计算右孩子深度,比较得出最大值,即二叉树深度。 通过先序序列键盘…

Golang 二叉树系列【二叉树深度】

题目 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。 题目示例 例如: 给定二叉树 [3,9,20,null,null,15,7] 3/ \9 20/ \15 …

二叉树深度优先遍历解题思路

文章目录 1.二叉树深度优先遍历解题思路1.1.三种深度优先遍历的方式1.2.深度优先遍历的启示1.2.1.递归形成条件1.2.2递归过程的实际工作顺序1.2.2.1.单路递归的实际工作顺序1.2.2.2. 双路递归的实际工作顺序 1.2.3.三种深度优先遍历给我们的启示是什么? 1.3.深度优先…

[剑指Offer]-二叉树的深度

题目描述(一) 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点…

二叉树的高度和深度定义、回溯(个人学习记录)

1.二叉树的高度和深度定义 (对某个节点来说)深度是指从根节点到该节点的最长简单路径边的条数;高度是指从最下面的叶子节点到该节点的最长简单路径边的条数; (对二叉树)深度是从根节点数到它的叶节点&…

二叉树之二叉树的深度

1.二叉树的max deep 1. 高度与深度 二叉树的高度: 任意一个节点到叶节点的max距离 深度: 任意一个节点到根节点的max距离 求深度: 后续 left right mid 先求子节点的深度,1即为父节点深度 求高度 lef mid right 1 1 1逼近高度 2.求高度 1.递归思路 1max(left,right) 递归函…

二叉树的深度

二叉树的深度计算 1、一颗树只有一个节点,它的深度是1; 2、二叉树的根节点只有左子树而没有右子树,那么可以判断,二叉树的深度应该是其左子树的深度加1; 3、二叉树的根节点只有右子树而没有左子树,那么可…

计算二叉树深度算法(递归、非递归)入门详解

一、引言 二叉树在应用时,经常需要知道二叉树的深度。二叉树的深度就是二叉树的层数,即从树根算起,到最底下一层的层数是多少,即二叉树中结点的最大层次值。 本文给出了计算二叉树深度的算法,包括递归算法和非递归算法…

计算二叉树的深度

[算法步骤] 如果是空树,递归结束,深度为0;否则执行一下操作 递归计算左子树的深度计为m;递归计算右子树的深度计为n;如果m大于n,二叉树的深度为m1,否则为n1; [算法描述] int Depth(BiTree T) {int m, n…

CreateDialog

使用对话框模版资源创建一个非模态对话框。 CreateDialog调用 CreateDialogParam 函数。 调用语序: HWND CreateDialog(HINSTANCE hInstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc); 参数 hInstance类型:HINSTANCE 对话框模版…

android 使用showDialog调用相应的对话框

在Activity下调用此函数 showDialog(10); 然后重写以下函数 protected Dialog onCreateDialog(int id) {// TODO Auto-generated method stubswitch(id){case 10:return new AlertDialog.Builder(Activity13.this).setTitle(getString(R.string.title)).setMessage(getString(…

Show()跟ShowDialog()的区别

Show和ShowDialog有什么不同呢,什么时候用Show,什么时候用ShowDialog呢?相信看完这篇博客,你会有一个比较明确的答案。 说到show跟ShowDialog的区别很多人会想到的是,他们一个是非模态一个是模态,模态窗体就…

WPF Tips: Window.ShowDialog()方法:Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelp

关于Window.ShowDialog()方法&#xff0c;有一个常见的容易犯的错误。下面给出这个错误的例子&#xff1a; DemoA&#xff1a;错误的例子 1. 在WPF项目中&#xff0c;创建一个Windows&#xff1a;DialogWindow DialogWindow.xaml <Window x:Class"DemoA.DialogWindow&…

showdialog

在C#中窗口的显示有两种方式&#xff1a;模态显示&#xff08;showdialog&#xff09;和非模态显示&#xff08;show&#xff09;。 区别&#xff1a; 模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体。模态窗体不允许操作其他窗体&#xff0c;非模态窗体可以…

Flutter dialog (1) - showDialog的讲解

在应用开发中,或多或少都会遇到需要弹框的问题, 比如:需要用户确认,需要输入一些信息等等的问题,这就要用到 dialog 相关的概念了 而在 flutter 中,所有可以看见的都是 Widget,dialog 也不例外 不过和 android 或 iOS 中不同的一点是,Flutter 中 dialog 不是一个单独的类,而是…

C# 按Button弹出新的窗体 Show()方法 和 ShowDialog()方法

在做串口通信程序时&#xff0c;有个想法&#xff0c;当点击串口设置按钮时&#xff0c;弹出一个新的窗口&#xff0c;可以设置串口相关信息&#xff0c;如何实现这一操作呢&#xff1f; 1 新建一个项目&#xff0c;窗体为form1 2 选择项目名称&#xff0c;单击右键&#xff0…

C# 弹出窗口 show()和showdialog()

目录 一、构建工程和界面介绍二 、添加代码三、验证效果和小结 我们在构建C# Form窗口的时候经常需要到弹出新的窗口&#xff0c;那么接着就会如何弹出窗口的疑问。这里介绍最常见的两种弹窗方法show()和showdialog()。我在VS2019中构建一个简单的工程来讲解让他们之间的区别。…

fwrite函数,fread函数和fgets函数详解以及使用方法

c/c文件处理函数 1. fgets函数 函数原型 char *fgets(char *s, int size, FILE *stream);参数解释&#xff1a; s 代表要保存到的内存空间的首地址&#xff0c;可以是字符数组名&#xff0c;也可以是指向字符数组的字符指针变量名。size 代表的是读取字符串的长度。stream …

c语言 fread读指定字节,fread函数 c语言中fread函数怎么用

fread是一个函数,它从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回0。返回真实读取的项数,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。若…