☰
《二叉树的基础知识、操作方法与代码示例》
2026/10/11 1:39:20 网站建设 项目流程

《二叉树的基础知识、操作方法与代码示例》

  • 一.了解二叉树
    • 1.1二叉树是什么
  • 二.二叉树基本知识
    • 2.1二叉树基本概念![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e41bec580c994b0081ba0aa902d29406.png)
      • 1)节点的度:节点很容易理解,他的度就是他的下面有多少个子树!
      • 2)树的度
      • 3)叶子节点为:5 D,F,G,H,I
      • 4)父节点:4 A,B,C,E
      • 5)子节点 : 父节点的子树的根节点
      • 6)根节点:A
      • 7)节点层次:4,根节点为第一层
      • 8)树的高度:节点最大层次
    • 2.2两种二叉树
      • ①满二叉树
      • ②完全二叉树
    • 1.3二叉树的模拟
  • 二叉树的四种遍历
    • 2.1先序遍历
    • 2.2中序遍历
    • 2.3后序遍历
    • 2.4层序遍历
  • 三.二叉树基本操作
    • 3.1获取数中节点个数
    • 3.2获取叶子节点个数
    • 3.3获取第几层数的节点
    • 3.4获取二叉树的深度/高度
    • 3.5检测值为val的值是否存在
    • 3.6判断是否是完全二叉树;

一.了解二叉树

1.1二叉树是什么

二叉树与之前我们学习的链表,顺序表不同,从这一章可能要上 强度了,之前我们学都都是线性结构;
而二叉树则是非线性结构;
== 说个比喻,我们打游戏时,想要进入下一个副本就必须将前一个副本打完,一个接一个,按顺序写,这就是线性结构,都是连在一起的,而非线性结构就是你可以选择分支,打完一个副本后,你可以自己选择岔路口,不一定要按顺序,想先打左边的副本BOSS可以,右边的副本BOSS也可以==
自然界的二叉树:


这是我在网上找的图,大自然确实神奇

二.二叉树基本知识

2.1二叉树基本概念

1)节点的度:节点很容易理解,他的度就是他的下面有多少个子树!

A的度为2,B,C

2)树的度

这个二叉树的度:3

3)叶子节点为:5 D,F,G,H,I

4)父节点:4 A,B,C,E

5)子节点 : 父节点的子树的根节点

6)根节点:A

7)节点层次:4,根节点为第一层

8)树的高度:节点最大层次

…

2.2两种二叉树

①满二叉树

满二叉树是节点最多的一种二叉树

②完全二叉树

这个没法说出准确的定义;只能说二叉树按层从坐到右右子树出现之前必须有左子树

这是一个完全二叉树,但如果把第四层的变为右子树就是错的

这就不是完全二叉树

1.3二叉树的模拟

二叉树有着左右子树;

publicstaticNodeTreeDemo(){NodeA=newNode("A");NodeB=newNode("B");NodeC=newNode("C");NodeD=newNode("D");NodeE=newNode("E");NodeF=newNode("F");NodeG=newNode("G");NodeH=newNode("A");A.left=B;A.right=C;B.left=D;B.right=E;C.left=F;C.right=G;E.left=H;returnA;}

二叉树的四种遍历

2.1先序遍历

1)先根节点
2)遍历左子树
3)遍历右边树
如果为空,达到界限;
这个的先序遍历: A B D E H C F G

publicvoidpreorder(Noderoot){if(root==null){return;}System.out.print(root.val+" ");preorder(root.left);preorder(root.right);}

验证:

publicstaticvoidmain(String[]args){Noderoot=TreeDemo();preorder(root);}


2.2中序遍历


1)遍历左子树
2)根节点
3)遍历右边树
如果为空,达到界限;
这个的先序遍历: D B H E A F C G
验证:

publicstaticvoidmain(String[]args){Noderoot=TreeDemo();// preorder(root);// System.out.println();inOrder(root);}

2.3后序遍历

1)遍历左子树;
2)遍历右子树
3)根节点

publicstaticvoidpostOrder(Noderoot){if(root==null){return;}postOrder(root.left);postOrder(root.right);System.out.print(root.val+" ");}

遍历顺序: D H E B F G C A

2.4层序遍历

1)首先头节点入队列;
2)判断Queue是否为空,然后出栈
3) 判断左节点不为空,入栈;
4)判断右节点不为空,入栈;

publicstaticvoidlevelOrder(Noderoot){if(root==null){return;}Queue<Node>queue=newLinkedList<>();queue.offer(root);while(!queue.isEmpty()){Nodecur=queue.poll();System.out.print(cur.val+" ");if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}}}

三.二叉树基本操作

3.1获取数中节点个数


1)节点个数:根节点个数+左子树节点个数+右子树节点个数;
2)递归界限:当节点左右子树都为空,返回1;

publicstaticintsize(Noderoot){if(root==null){return0;}if(root.left==null&&root.right==null){return1;}return1+size(root.left)+size(root.right);}

3.2获取叶子节点个数

1)获取左子树的叶子结点的个数;
2)获取右子树的叶子节点的个数:
3)界限:先判断节点是否为空,返回0,再判断节点的左右是否为空.判断是否叶子节点,返回1;
叶子节点个数:左子树叶子结点+右子树节点个数

publicstaticintgetLeafNodeCount(Noderoot){if(root==null){return0;}if(root.left==null&&root.right==null){return1;}returngetLeafNodeCount(root.left)+getLeafNodeCount(root.right);}

3.3获取第几层数的节点

1)获取二叉树的第K层节点个数,就是左右子树的k-1层数;
2)界限:首先当root为null或者k<=0,返回

publicstaticintgetKLeafCount(Noderoot,intk){if(root==null||k<=0){return0;}if(k==1){return1;}returngetKLeafCount(root.left,k-1)+getKLeafCount(root.right,k-1);}

3.4获取二叉树的深度/高度

1)高度 = 根节点一层+左右子树高度较高的层数;
2)当root为null返回0,root.leftnull&&root.rightnull,返回1;

publicstaticintgetHight(Noderoot){if(root==null){return0;}if(root.left==null&&root.right==null){return1;}return1+Math.max(getHight(root.left),getHight(root.right));}

3.5检测值为val的值是否存在

1)判断是否为空树
2)先看根节点是否有相等的值,然后依次判断左右子树是否有相等的值

publicstaticNodefind(Noderoot,intval){if(root==null){returnnull;}if(root.val.equals(val)){returnroot;}NodeleftRoot=find(root.left,val);if(leftRoot!=null){returnleftRoot;}returnfind(root.right,val);}

3.6判断是否是完全二叉树;

1)首先假设节点都有左右子树
标志变量 fla----->false(还未进入二阶段后面节点都没子节点)
2)节点可能不是左右子树
①.节点是右边子树,直接返回false;
②.节点没有子节点,后面的节点都必须没有节点(二阶段,标志为true);
③.节点只有左子节点,后面的节点都必须没有节点(二阶段,标志为true);

publicbooleanisCompleteTree(TreeNoderoot){if(root==null){returnfalse;}booleanfla=false;Queue<TreeNode>queue=newLinkedList<>();queue.offer(root);while(!queue.isEmpty()){TreeNodecur=queue.poll();if(!fla){if(cur.left!=null&&cur.right!=null){queue.offer(cur.left);queue.offer(cur.right);}elseif(cur.left==null&&cur.right!=null){returnfalse;}elseif(cur.left!=null&&cur.right==null){queue.offer(cur.left);fla=true;}else{fla=true;}}else{if(cur.left!=null||cur.right!=null){returnfalse;}}}returntrue;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询