Java实现二叉树的前序、中序、后序、层序遍历(递归方法)

public class Tree<AnyType extends Comparable<? super AnyType>> { private static class BinaryNode<AnyType> {BinaryNode(AnyType theElement) { this(theElement, null, null); } BinaryNode(AnyType theElement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt) { element = theElement; left = lt; right = rt; } AnyType element;         BinaryNode<AnyType> left; BinaryNode<AnyType> right; }private BinaryNode<AnyType> root; public void insert(AnyType x) { root = insert(x, root); } private BinaryNode<AnyType> insert(AnyType x, BinaryNode<AnyType> t) { if(t == null) { return new BinaryNode<>(x, null, null); } int compareResult = x.compareTo(t.element); if(compareResult < 0) { t.left = insert(x, t.left); } else if(compareResult > 0) { t.right = insert(x, t.right); } else { ; } return t; } /** * 前序遍历 */ public void preOrder(BinaryNode<AnyType> Node) { if (Node != null) { System.out.print(Node.element + " ");preOrder(Node.left); preOrder(Node.right); } } /** * 中序遍历*/ public void midOrder(BinaryNode<AnyType> Node) { if (Node != null) { midOrder(Node.left); System.out.print(Node.element + " "); midOrder(Node.right); } } /** * 后序遍历 */ public void posOrder(BinaryNode<AnyType> Node) { if (Node != null) {posOrder(Node.left); posOrder(Node.right); System.out.print(Node.element + " "); } } /* * 层序遍历 * 递归*/ public void levelOrder(BinaryNode<AnyType> Node) { if (Node == null) { return; } int depth = depth(Node); for (int i = 1; i <= depth; i++) { levelOrder(Node, i); } } private void levelOrder(BinaryNode<AnyType> Node, int level) { if (Node == null || level < 1) { return; } if (level == 1) { System.out.print(Node.element + " "); return; } // 左子树levelOrder(Node.left, level - 1); // 右子树levelOrder(Node.right, level - 1); } public int depth(BinaryNode<AnyType> Node) { if (Node == null) {return 0; } int l = depth(Node.left); int r = depth(Node.right); if (l > r) { return l + 1; } else { return r + 1; } } public static void main( String[] args ) { int[] input = {4, 2, 6, 1, 3, 5, 7, 8, 10}; Tree<Integer> tree = new Tree<>(); for(int i = 0; i < input.length; i++) { tree.insert(input[i]); } System.out.print( "前序遍历 :" ); tree.preOrder(tree.root); System.out.print( "\n中序遍历 :" ); tree.midOrder(tree.root); System.out.print( "\n后序遍历 :" ); tree.posOrder(tree.root); System.out.print("\n递归层序遍历:"); tree.levelOrder(tree.root); } }

时间: 2024-10-14 16:43:26

Java实现二叉树的前序、中序、后序、层序遍历(递归方法)的相关文章

分别求二叉树前、中、后序的第k个节点

一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 int n=1; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' '; if(n==k) return root->data; n++; elemType ch = preNode(root->lchild,k); if(ch!=' ') return ch; ch = preNode(root->rchild,k); return ch;

算法实验-二叉树的创建和前序-中序-后序-层次 遍历

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为char型变量 '0'为空,即此处的节点不存在 头文件 Tree.h //链式二叉树的头文件 #pragma once #include<iostream> #include<queue> using namespace std; class BinaryTreeNode { public: char data; BinaryTreeNode *leftChild,*rightChild; BinaryTr

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

已知二叉树前、中序遍历,求后序 / 已知二叉树中、后序遍历,求前序

void solve(int start,int end,int root) { // 前序和中序 -> 后序 // 每次调用solve()函数,传入pre-order的start,end,root if (start > end) // 递归边界 return; int i = start; while (i < end && in.at(i) != pre.at(root)) // 找到左右子树的分割点 i++; solve(start, i - 1, root +

日常学习随笔-用链表的形式实现普通二叉树的新增、查找、遍历(前、中、后序)等基础功能(侧重源码+说明)

一.二叉树 1.二叉树的概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree),其次序不能任意颠倒. 2.性质 (1)若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0): (2)高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1). (空树的高度为-1): (3)对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n,

算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } 一个数组的MaxTree定义如下: ◆ 数组必须没有重复元素 ◆ MaxTree是一颗二叉树,数组的每一个值对应一

紫书p155 用中序后序构造二叉树

二叉树各节点权值是不相同的正整数,输入二叉树的中序后序,求到根节点权和最小的叶节点 紫书贼强,递归写的服气,慢慢理解吧 原文是建树之后用dfs搜的,我试着一边建树一边归纳最短路径 #include<bits/stdc++.h> using namespace std; const int maxv = 10010; int in[maxv], post[maxv], lch[maxv], rch[maxv];//中序,后序,左子树,右子树 int n, minnum, minsum; bool

20140510 二叉树的建立 先序 后序 中序 比较

#include<stdio.h> #include<malloc.h> typedef struct node { int data; struct node *lchild,*rchild; }; node * create()//先序建立二叉树,根左右 { int x=0; node *t; printf(" input data:"); scanf("%d",&x); if(x==0) t=NULL; else { t=(no

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.csdn.net/why850901938/article/details/51052156 首先为了讲解方便,我建立了如图所示的二叉树: 取名为:树A 1.何为层序遍历? 层序遍历就是按照二叉树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右: 以树A为例,层序遍历得到的结果为: 5 2 6 1