二叉树的构建与输入,前序中序后序

  1 package org.lyk.main;
  2
  3 import java.util.Scanner;
  4
  5
  6 class Test<T>
  7 {
  8     public static <T> void print(T d)
  9     {
 10         System.out.println(d);
 11     }
 12 }
 13
 14 class Node<T extends Comparable<T> >
 15 {
 16     Node<T> left;
 17     T data;
 18     Node<T> right;
 19
 20     void add(T data)
 21     {
 22         if (data.compareTo(this.data) < 0)
 23         {
 24             if (null != this.left)
 25                 this.left.add(data);
 26             else
 27             {
 28                 this.left = new Node<T>();
 29                 this.left.data = data;
 30             }
 31         } else
 32         {
 33             if (null != this.right)
 34                 this.right.add(data);
 35             else
 36             {
 37                 this.right = new Node<T>();
 38                 this.right.data = data;
 39             }
 40         }
 41     }
 42     public static <T extends Comparable<T>> Node<T> add_first(Node<T> node,Scanner scanner)
 43     {
 44         String data = input(scanner);
 45         if("*".equals(data))
 46         {
 47             node = null;
 48         }
 49         else
 50         {
 51             node = new Node<T>();
 52             node.data = (T)data;
 53             node.left = Node.add_first(node.left,scanner);
 54             node.right = Node.add_first(node.right,scanner);
 55         }
 56         return node;
 57     }
 58
 59     private static String input(Scanner scanner)
 60     {
 61         scanner.useDelimiter("\r\n");
 62         System.out.print("请输入:");
 63         String data = (String)scanner.next();
 64         return data;
 65     }
 66
 67     void get_first()
 68     {
 69         System.out.print(this.data);
 70         if(null != this.left )
 71         {
 72             this.left.get_first();
 73         }
 74         if(null != this.right)
 75         {
 76             this.right.get_first();
 77         }
 78     }
 79
 80     public void get_middle()
 81     {
 82         if(null != this.left)
 83             this.left.get_middle();
 84         System.out.print(this.data);
 85         if(null != this.right)
 86             this.right.get_middle();
 87     }
 88
 89     public void get_last()
 90     {
 91         if(null != this.left )
 92             this.left.get_last();
 93         if(null != this.right)
 94             this.right.get_last();
 95         System.out.print(this.data);
 96     }
 97 }
 98
 99 class Tree<T extends Comparable<T>>
100 {
101     Node<T> root;
102
103     public void add_first(Scanner scanner)
104     {
105         this.root = Node.add_first(this.root,scanner);
106     }
107
108     public void get_first()
109     {
110         if(null != root)
111         {
112             root.get_first();
113         }
114     }
115     public void get_middle()
116     {
117         if(null != this.root)
118             this.root.get_middle();
119     }
120     public void get_last()
121     {
122         if(null != this.root)
123             this.root.get_last();
124     }
125 }
126
127 public class Main
128 {
129     public static void main(String[] args)
130     {
131         Scanner scanner = new Scanner(System.in);
132         Tree<String> bt = new Tree<>();
133         bt.add_first( scanner);
134         System.out.println("先序输出:");
135         bt.get_first();
136         System.out.println("中序输出:");
137         bt.get_middle();
138         System.out.println("后序输出:");
139         bt.get_last();
140         scanner.close();
141         System.out.println("///~ main done");
142     }
143 }
时间: 2024-11-05 22:37:14

二叉树的构建与输入,前序中序后序的相关文章

二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

今天看了一些关于平和查找二叉树的问题,顺便也复习了一下二叉树的遍历规则,写一下学习文档. 树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 如图所示二叉树: 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则: (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成. 前序遍历的输出结果:ABDECF 中序遍历:中序遍历可以记为左根右,也

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

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

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

对于二叉树的创建我是利用先序遍历的序列进行创建 能够对于树节点的内容我定义为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

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

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 +

(原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数

题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点,接着前序遍历左子树,最后再前序遍历右子树. 2.中序遍历:若二叉树为空,则空操作:否则先中序遍历左子树,接着访问根结点,最后再前中遍历右子树. 3.后序遍历:若二叉树为空,则空操作:否则先后序遍历左子树,接着后序遍历右子树,最后再访问根结点. 现在的问题是给定前序遍历和后序遍历的顺序,要求出总共有多

紫书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

二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板

面试的痛 前几天去阿里面试,一时忘记了二叉树的前序遍历中序遍历和后序遍历的概念,已经想死了. 然后最近去腾讯面试,被问到怎么已知前序遍历/后序遍历 + 中序遍历,求后序遍历/前序遍历,看来这种问题很喜欢考. 其实这个问题想清楚了很简单,只要把这三个概念理解透彻就可以做出来了,比如前序遍历的第一个值一定是根节点,然后这个根节点对应到中序遍历里面,在中序遍历的这个值的两边的值,一定在以此节点为根节点的两个子树上,同理,后序遍历也一样. 已知前序遍历和后序遍历是不能求唯一的中序遍历树的. #inclu

根据前序和中序遍历求后序 /后序和中序求前序

给出一二叉树的前序遍历的顺序和中序遍历的顺序我们可以由此得出后序遍历的顺序,根据它们的访问顺序,前序遍历的第一个结点肯定是根结点,与之对应在中序遍历找到对应的根结点的位置,那么在中序遍历中,根结点的左边的元素都属于左子树的元素,根结点右边的元素都属于右子树的元素,之后把左子树当成一个继续操作,就这样可以推出整个树,继而求出后序遍历: #include<iostream> #include<cstdlib> #include<cstring> #include<cs

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

一.二叉树 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,