二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度

本文主要是介绍二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度计算

输入格式:如   abd###ce##f##*

 

package tree;
//二叉树的二叉链表实现
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
public class BTree<AnyType> {
BTNode rootNode=new BTNode();
class BTNode<AnyType>{
char data;
BTNode<AnyType> leftChildNode;
BTNode<AnyType> rightChildNode;
public BTNode(){
data=0;
leftChildNode=rightChildNode=null;
}
public BTNode(char data){
this.data=data;
leftChildNode=rightChildNode=null;
}
public BTNode(char data,BTNode leftChildNode,BTNode rightChildNode){
this.data=data;
leftChildNode=leftChildNode;
rightChildNode=rightChildNode;
}
}
//先序创建二叉树
char d[]=new char[100];
int i=0;
public BTNode creatBTree(){
BTNode node=null;
if(d[i]!='*'){
if(d[i]=='#'){
node=null;
i++;
}
else{
node=new BTNode(d[i]);
i++; 
node.leftChildNode=creatBTree();   
node.rightChildNode=creatBTree();			
}
}
return node;
}
//先序递归遍历
public void preOrder(BTNode<AnyType> t){
if(t!=null){
System.out.print(t.data);
preOrder(t.leftChildNode);
preOrder(t.rightChildNode);
}
}
//先序非递归遍历
public void preStackOrder(BTNode t){
Stack s=new Stack();
BTNode p=t;
while(p!=null&&s.isEmpty()!=true){
if(p!=null){
System.out.print(p.data);
s.push(p);
p=p.leftChildNode;
}
if(s.isEmpty()){
s.pop();
p=p.rightChildNode;
}
}
}
//中序递归遍历
public void inOrder(BTNode t){
if(t!=null){
inOrder(t.leftChildNode);
System.out.print(t.data);
inOrder(t.rightChildNode);
}
}
//中序非递归遍历
public void inStackOrder(BTNode t){
Stack<BTNode> s=new Stack<BTNode>();
BTNode p=t;
while(p!=null&&s.isEmpty()){
if(p!=null){
s.push(p);
p=p.leftChildNode;
}
if(s.isEmpty()!=true){
p=s.pop();
System.out.print(p.data);
p=p.rightChildNode;
}
}
}
//后序递归遍历
public void postOrder(BTNode t){
if(t!=null){
postOrder(t.leftChildNode);
postOrder(t.rightChildNode);
System.out.print(t.data);
}
}
//后序非递归遍历
public void postStackOrder(BTNode t){
Stack<BTNode> s=new Stack<BTNode>();
Stack<Integer> ss=new Stack<Integer>();
Integer i=new Integer(1);
BTNode p=t;
BTNode q=t;
while(p!=null||s.isEmpty()!=true){	
while(p!=null){
s.push(p);
ss.push(new Integer(0));
p=p.leftChildNode;	
}
while(s.isEmpty()!=true&&ss.peek().equals(i)){
ss.pop();
q=s.pop();
System.out.print(q.data);	
}
if(s.isEmpty()!=true){
ss.pop();
ss.push(i);
p=s.peek();
p=p.rightChildNode;	
}	
}	
}
//层次非递归遍历
public void levelQueueOrder(BTNode t){
Queue<BTNode> q=new LinkedList<BTNode>();
q.add(t);
while(q.isEmpty()!=true){
BTNode step=q.remove();
System.out.print(step.data);
if(step.leftChildNode!=null){
q.add(step.leftChildNode);
}
if(step.rightChildNode!=null){
q.add(step.rightChildNode);
}
}
}
//计算二叉树深度
public int depth(BTNode t){
int leftDepth,rightDepth;
if(t==null) 
return 0;
leftDepth=depth(t.leftChildNode);
rightDepth=depth(t.rightChildNode);
return Math.max(leftDepth,rightDepth)+1;
}
//叶子结点个数
int num=0;
public int leaf(BTNode t){
if(t!=null){
if(t.leftChildNode==null&&t.rightChildNode==null)
num++;
leaf(t.leftChildNode);
leaf(t.rightChildNode);
}
return num;
}
public static void main(String[] args) {
BTree bt=new BTree();
Scanner sc=new Scanner(System.in);
String a=sc.next();
char c[]=a.toCharArray();
for(int i=0;i<c.length;i++){
bt.d[i]=c[i];
}
bt.rootNode=bt.creatBTree();
System.out.println("先序遍历");
bt.preOrder(bt.rootNode);
System.out.println();
System.out.println("中序遍历");
bt.inOrder(bt.rootNode);
System.out.println();
System.out.println("后序遍历");
bt.postOrder(bt.rootNode);
System.out.println();
System.out.println("后序非递归遍历");
bt.postStackOrder(bt.rootNode);
System.out.println("层次遍历");
bt.levelQueueOrder(bt.rootNode);
System.out.println();
System.out.println("二叉树深度");
System.out.println(bt.depth(bt.rootNode));
System.out.println("叶子结点个数");
System.out.println(bt.leaf(bt.rootNode));
}
}

这篇关于二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088835

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

剑指offer(C++)--平衡二叉树

题目 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 class Solution {public:bool IsBalanced_Solution(TreeNode* pRoot) {if(pRoot==NULL)return true;int left_depth = getdepth(pRoot->left);int right_depth = getdepth(pRoot->rig

剑指offer(C++)--两个链表的第一个公共结点

题目 输入两个链表,找出它们的第一个公共结点。 解法一 两个链表一定有交点的话,方法是指向短链表指针先走完,然后指向长链表,指向长链表指针后走完,指向短链表。所以,第二次走过,一定会在交点相遇。 class Solution {public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {ListN

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

二叉树三种遍历方式及其实现

一、基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。 性质: 1、非空二叉树的第n层上至多有2^(n-1)个元素。 2、深度为h的二叉树至多有2^h-1个结点。 3、对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 满二叉树:所有终端都在同一层次,且非终端结点的度数为2。 在满二叉树中若其深度为h,则其所包含

好书推荐《深度学习入门 基于Python的理论与实现》

如果你对Python有一定的了解,想对深度学习的基本概念和工作原理有一个透彻的理解,想利用Python编写出简单的深度学习程序,那么这本书绝对是最佳的入门教程,理由如下:     (1)撰写者是一名日本普通的AI工作者,主要记录了他在深度学习中的笔记,这本书站在学习者的角度考虑,秉承“解剖”深度学习的底层技术,不使用任何现有的深度学习框架、尽可能仅使用基本的数学知识和Python库。从零创建一个

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

【图像识别系统】昆虫识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50

一、介绍 昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集(‘蜜蜂’, ‘甲虫’, ‘蝴蝶’, ‘蝉’, ‘蜻蜓’, ‘蚱蜢’, ‘蛾’, ‘蝎子’, ‘蜗牛’, ‘蜘蛛’)进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一

【Qt6.3 基础教程 17】 Qt布局管理详解:创建直观和响应式UI界面

文章目录 前言布局管理的基础为什么需要布局管理器? 盒布局:水平和垂直排列小部件示例:创建水平盒布局 栅格布局:在网格中对齐小部件示例:创建栅格布局 表单布局:为表单创建标签和字段示例:创建表单布局 调整空间和伸缩性示例:增加弹性空间 总结 前言 当您开始使用Qt设计用户界面(UI)时,理解布局管理是至关重要的。布局管理不仅关系到UI的外观,更直接影响用户交互的体验。本篇博