数据结构—二叉树深度优先遍历

article/2025/11/10 23:56:41

二叉树是一种常见的数据结构,理解二叉树对于理解AVL树、红黑树都有重要意义,索性再重新梳理一下思路,加深印象。本文重点介绍二叉查找树。

1.二叉树与二叉查找树

二叉树(binary tree)是树的一种特殊形式,这种树的每个节点做多只有两个孩子节点,二叉树结构如图:
在这里插入图片描述
二叉树的树形结构使它很适合扮演索引的角色,因此出现了一种特殊的二叉树—二叉查找树(binary search tree),二叉查找树在二叉树的基础上,又增加了几个条件:
1)如果左子树不为空,则左子树上所有的节点值均小于根节点值;
2)如果右子树不为空,则右子树上所有节点的值均大于根节点的值;
3)左右子树也都是二叉查找树

下图就是一个典型的二叉查找树:
在这里插入图片描述

2.二叉树的深度优先遍历

2.1前序遍历

二叉树的前序遍历,输出顺序是根节点、左子树、右子树。示意图如图所示:
1)首先输出根节点6;
2)由于根节点6存在左子节点,输出左子节点3;
3)由于节点3也存在子节点,输出左子节点2;
4)节点2没有左子节点,也没右子节点,回到节点3,输出节点3右子节点5;
5)节点5既没左子节点,也没右子节点,回到节点6,输出节点6的右子节点8;
6)节点8没有左子节点,有右子节点,因此输出节点8的右子节点9;
到此为止,所有节点输出完毕。
在这里插入图片描述

2.2中序遍历

二叉树的前序遍历,输出顺序是左子树、根节点、右子树。示意图如图所示:
1)首先访问左子节点,如果左子节点还有左子节点,则继续深入访问,一直找到不再有左子节点的节点,输出节点2;
2)输出节点2的父节点节点3;
3)输出节点2的右节点节点5;
4)以节点2为根的左子树已输出完毕,这时输出整个二叉树的根节点节点6;
5)由于节点8没左子节点,直接输出节点8;
6)最后输出节点8的右子树节点9;
到此为止,所有节点输出完毕。
在这里插入图片描述

2.3后序遍历

二叉树的前序遍历,输出顺序是左子树、右子树、根节点。示意图如图所示:
1)首先访问左子节点,如果左子节点还有左子节点,则继续深入访问,一直找到不再有左子节点的节点,输出节点2;
2)输出节点2的右节点节点5;
3)输出节点2的父节点节点3;
4)以节点2为根的左子树已输出完毕,开始查找根节点的右子树,节点8没有左子节点,但有右子节点,输出右子节点9;
5)输出右子节点的父节点节点8;
6)最后输出节根节点节点6;
到此为止,所有节点输出完毕。
在这里插入图片描述

3.配套代码

三种遍历方式,用递归实现会非常简单。

/*** 二叉查找树*/
public class BinarySearchTree {//根节点TreeNode root;/*** 构建二叉查找树* @param node* @param data*/public void createTree(TreeNode node, int data){if(root == null){root = new TreeNode(data);}else{if(data < node.data){if(node.left == null){node.left = new TreeNode(data);}else{createTree(node.left,data);}}else{if(node.right == null){node.right = new TreeNode(data);}else{createTree(node.right,data);}}}}/***二叉树前序遍历* @param node*/public void preOrderTraversal(TreeNode node){if(node == null){return ;}System.out.println(node.data);preOrderTraversal(node.left);preOrderTraversal(node.right);}/***二叉树中序遍历* @param node*/public void middleOrderTraversal(TreeNode node){if(node == null){return ;}middleOrderTraversal(node.left);System.out.println(node.data);middleOrderTraversal(node.right);}/***二叉树后序遍历* @param node*/public void postOrderTraversal(TreeNode node){if(node == null){return ;}postOrderTraversal(node.left);postOrderTraversal(node.right);System.out.println(node.data);}
}
/*** 二叉树节点*/
class TreeNode {//节点数据int data;//左子树TreeNode1 left;//右子树TreeNode1 right;public TreeNode(int data) {this.data = data;}
}

测试类:

public  static void main(String[] args){int[] arr = {10,2,3,1,11};BinarySearchTree tree = new BinarySearchTree();for(int data : arr){tree.createTree(tree.root,data);}//前序遍历System.out.println("********前序遍历********");tree.preOrderTraversal(tree.root);//中序遍历System.out.println("********中序遍历********");tree.middleOrderTraversal(tree.root);//后序遍历System.out.println("********后序遍历********");tree.postOrderTraversal(tree.root);}

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

相关文章

4.13每日一题之二叉树深度(洛谷c++)|dfs遍历树

&#x1f344;前言 大家好哇&#xff0c;我是一勺黑猫。今天是每日一题的第十三天&#xff0c;欢迎更多小伙伴加入到我们的打卡计划中&#xff0c;希望和你们在学习算法的路上一起进步~ &#x1f64e;作者简介&#xff1a;一个正在努力学算法和后端的大三girl ⏳每日一题打卡地…

二叉树深度优先搜索算法

题目&#xff1a; 输入一颗二叉树和一个整数&#xff0c;打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路分析&#xff1a; 是图形相关的算法。首先考虑解决图形相关的广度搜索优先算法就是深度搜…

leetcode104---求二叉树深度

leetcode104—求二叉树深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 思路 对于二叉树深度问题&#xff0c;深度为左右子树深度最大值加1 depth max(left_depth, right_depth)1二叉树问题考虑递归方法&…

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

二叉树深度优先遍历的递归实现 一、深度优先遍历二、先序遍历1.算法思路2.代码实现 三、中序遍历1.算法思路2.代码实现 四、后序遍历1.算法思路2.代码实现 一、深度优先遍历 对每一个可能的分支路径深入到不能再深入为止&#xff0c;而且每个结点只能访问一次。 要特别注意的是…

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

二叉树深度和高度 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的二叉树。想求得此二叉树深度&#xff0c;先计算左孩子深度&#xff0c;再计算右孩子深度&#xff0c;比较得出最大值&#xff0c;即二叉树深度。 通过先序序列键盘…

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

题目 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条路径&#xff0c;最长路径的长度为树的深度。 题目示例 例如&#xff1a; 给定二叉树 [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.三种深度优先遍历给我们的启示是什么&#xff1f; 1.3.深度优先…

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

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

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

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

二叉树之二叉树的深度

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

二叉树的深度

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

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

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

计算二叉树的深度

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

CreateDialog

使用对话框模版资源创建一个非模态对话框。 CreateDialog调用 CreateDialogParam 函数。 调用语序&#xff1a; HWND CreateDialog(HINSTANCE hInstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC lpDialogFunc); 参数 hInstance类型&#xff1a;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有什么不同呢&#xff0c;什么时候用Show&#xff0c;什么时候用ShowDialog呢&#xff1f;相信看完这篇博客&#xff0c;你会有一个比较明确的答案。 说到show跟ShowDialog的区别很多人会想到的是&#xff0c;他们一个是非模态一个是模态&#xff0c;模态窗体就…

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 不是一个单独的类,而是…