编程之美 3.9 :重建二叉树
来源:互联网 发布:网络黄歌试听 编辑:程序博客网 时间:2024/05/16 11:12
问题描述:给定一个前序遍历和一个中序遍历,重建一棵二叉树。如:
前序:a b d c e f
中序:d b a e c f
思路:根据前序,找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f
package suda.alex.chapter3;import java.util.Scanner;public class RebuildTree { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); String preStr = scanner.next(); String inStr = scanner.next(); char[] pre = preStr.toCharArray(); char[] in = inStr.toCharArray(); Node tree = reBuildTree(pre, in); printTree(tree); } } public static Node reBuildTree(char[] pre, char[] in) { int n = pre.length; // 二叉树的节点数 Node root = new Node(pre[0]); int leftLen = 0; while (leftLen < n && in[leftLen] != pre[0]) { // 在中序中查找pre[0]出现的位置。注:pre[0]就是此时的根 leftLen++; } int rightLen = n - leftLen - 1; char[] left1 = new char[leftLen]; // 查找到pre[0]之后,前序中的左子数序列。 char[] right1 = new char[rightLen]; // 前序中的右子数序列 char[] left2 = new char[leftLen]; // 中序中的左子数序列 char[] right2 = new char[rightLen];// 中序中的右子数序列 // 赋值 for (int i = 1; i <= leftLen; i++) { left1[i - 1] = pre[i]; left2[i - 1] = in[i - 1]; } for (int i = 0; i < rightLen; i++) { right1[i] = pre[i + leftLen + 1]; right2[i] = in[i + leftLen + 1]; } if (leftLen > 0) { root.left = reBuildTree(left1, left2); } if (rightLen > 0) { root.right = reBuildTree(right1, right2); } return root; } // 打印出二叉树 前序 用于验证生成的二叉树是否正确 public static void printTree(Node root) { if (root == null) { return; } System.out.print(root.val); printTree(root.left); printTree(root.right); }}class Node { char val; Node left; Node right; public Node(char val) { this.val = val; }}
0 0
- 编程之美3.9 重建二叉树
- [编程之美3.9]重建二叉树
- 编程之美3.9 重建二叉树
- 编程之美 3.9:重建二叉树
- 3.9-编程之美-重建二叉树
- <编程之美>3.9重建二叉树
- 编程之美--3.9 重建二叉树
- 编程之美 3.9 :重建二叉树
- 读书笔记之编程之美 - 3.9 重建二叉树
- 编程之美--重建二叉树
- 重建二叉树(编程之美)
- 编程之美-----重建二叉树
- 《编程之美》重建二叉树
- 编程之美--重建二叉树
- 编程之美-先序中序 重建二叉树
- 编程之美2: 重建二叉树
- 编程之美读书笔记-重建二叉树
- 编程之美 - 重建二叉树
- leetcode --- Longest Common Prefix
- 嵌入式系统学习(七)-bootloader修改实例
- Android开发中ListView的使用方法
- iOS学习笔记-TableView性能优化篇1
- bzoj3174 [Tjoi2013]拯救小矮人
- 编程之美 3.9 :重建二叉树
- android studio中添加genymotion模拟器
- LeetCode : Minimum Path Sum
- 腾讯云mysql重新设置密码解决办法
- Android基础之计时器
- 161001初识C++
- IPv4地址及分类
- 自动调用系统的拨号、上网和发送Email的功能的方法
- ConcurrentHashMap源码剖析