前序遍历和中序遍历求后序遍历

2024-05-11 07:32
文章标签 中序 遍历 后序 前序

本文主要是介绍前序遍历和中序遍历求后序遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个二叉树
前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
求其后续遍历。

求解过程

  1. 这三种遍历不知道是什么意思的请自行搜索。
  2. 通过前序遍历我们可知此树根节点为G(即前序遍历第一个字符)
  3. 观测中序遍历可知此树左子树所有节点为:ADEF 右子树所有节点为:HMZ(以根节点划分)
  4. 得到左子树的前序遍历(DAFE)中序遍历(ADEF) 顺序未变。
  5. 得到右字数的前序遍历(MHZ)中序遍历(HMZ) 顺序未变。
  6. 递归此过程,展开所有子树。

代码如下:
定义二叉树的类

view plain
public class Tree {  String root = "";//根节点  Tree left;       //左子树  Tree right;      //右子树  String pre = "";//前序遍历字符串  String in = "";//中序遍历字符串  String back = "";//后序遍历字符串  Tree(String s){  this.root = s;  }  Tree(){}     
}  
实现代码:
view plain
public class testTree {     public static String post = "";  /** * @param args */  public static void main(String[] args) {  String pre = "GDAFEMHZ";  String in = "ADEFGHMZ";  Tree t = new Tree();  t.root = in;  t.pre = pre;  build(t);  System.out.println(post);  }  /** * 采取后序遍历递归展开所有节点 * @param tree */  public static void build(Tree tree){  if(tree == null){  return;  }  open(tree);  if(tree.left != null){  open(tree.left);  build(tree.left);  }  if(tree.right != null){  open(tree.right);  build(tree.right);  }  post = post + tree.root;  }  /** * 将节点不是单字符的节点展开 * @param tree */  public static void open(Tree tree){  if(tree.root.length()>1){  String s2 = tree.root;  String s1 = tree.pre;  tree.root =s1.substring(0, 1);  String [] node = s2.split(tree.root);  if(node.length>=2){  tree.left = new Tree(node[0]);  tree.left.pre = s1.substring(1, node[0].length()+1);  tree.right = new Tree(node[1]);  tree.right.pre = s1.substring(s1.length()-node[1].length(), s1.length());  }    }  }    
}  

这篇关于前序遍历和中序遍历求后序遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

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

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 1.先回顾前序遍历和中序遍历的框架: void traverse(TreeNode root) {//

刷题——二叉树的前序遍历

二叉树的前序遍历_牛客题霸_牛客网 双指针法: /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/class Solution {public:/*

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

二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度计算 输入格式:如   abd###ce##f##*   package tree;//二叉树的二叉链表实现import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Sta

day16--513.找树左下角的值+112. 路径总和+106.从中序与后序遍历序列构造二叉树

一、513.找树左下角的值 题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/ 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www

6.二叉树.遍历

6.二叉树.遍历 深度优先遍历二叉树的递归遍历二叉树的迭代遍历 广度优先遍历 深度优先遍历 二叉树的递归遍历 递归算法的三个要素: 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止

spark中mapPartitions双重循环或两次遍历(duplicate)

在spark当中通常需要对mapPartitions内部进行计算,这样可以在不进行网络传输的情况下,对数据进行局部计算 而mapPartitions中的迭代器为Iterator scala中的Iterator只能进行一次迭代,使用过后就消失了,所以在mapPartitions中既不能两次遍历 如:一次mapPartitions求最大最小值 val it = Iterator(20, 4

二叉树的各种遍历姿势

前言 Node节点 public static class TreeNode {TreeNode left;TreeNode right;int val;} 定义 先序遍历:先访问根,再访问左子树,最后访问右子树中序遍历:先访问左子树,再访问根,最后访问右子树后序遍历:先访问左子树,再访问右子树,最后访问根 递归式模板 public void view(TreeNode root,