第3章 结构之法——重建二叉树

重建二叉树

问题描述

分析与解法

用java实现的代码如下:

 1 package chapter3jiegouzhifa.RebuildBinTree;
 2
 3 /**
 4  * 重建二叉树
 5  * 递归解法
 6  * @author DELL
 7  *
 8  */
 9 public class RebuildBinTree {
10     //定义节点类
11     public static class Node{
12         int left;  //左子树位置
13         int right;  //右子树位置
14         char value;  //节点值
15         public Node(int left, int right, char value){
16             this.left = left;
17             this.right = right;
18             this.value = value;
19         }
20         public void setLeft(int left) {
21             this.left = left;
22         }
23         public void setRight(int right) {
24             this.right = right;
25         }
26     }
27     /**
28      * 重建二叉树
29      * @param preOrder 前序遍历结果
30      * @param inOrder    中序遍历结果
31      * @param tree    重建的树
32      * @param root  当前重建树的根节点位置
33      */
34     public static void rebuild(String preOrder, String inOrder, Node[] tree, int root){
35
36         int nTreeLen = preOrder.length();
37         //检查边界条件
38         if(preOrder.length()==0||inOrder.length()==0)
39             return ;
40         //获取当前遍历的第一个节点
41         Node temp = new Node(-1,-1,preOrder.charAt(0));
42         //如果节点为空,把当前节点复制到根节点
43         if(tree[root]==null){
44             tree[root] = temp;
45         }
46         //如果当前树的长度为1,那么已经是最后一个节点
47         if(nTreeLen == 1){
48             return ;
49         }
50         //寻找左子树的结尾
51         int i=0;
52         while(inOrder.charAt(i)!=temp.value&&i<nTreeLen){
53             i++;
54         }
55 //        System.out.println(i);
56         //重建左子树
57         int index = root;
58         if(i>0){
59             tree[index].setLeft(++root);
60             Node left = new Node(-1,-1,preOrder.charAt(1));
61             tree[root]=left;
62 //            System.out.println(preOrder.substring(1,i+1)+" "+i);
63             rebuild(preOrder.substring(1,i+1),inOrder.substring(0, i),tree,root);
64         }
65         //重建右子树
66         if(nTreeLen-i-1>0){
67             tree[index].setRight(root+i);
68             Node right = new Node(-1,-1,preOrder.charAt(i+1));
69             tree[root+i] = right;
70             rebuild(preOrder.substring(i+1,nTreeLen),inOrder.substring(i+1, nTreeLen),tree,root+i);
71         }
72     }
73     public static void main(String[] args) {
74         String preOrder = "abdcef";
75         String inOrder = "dbaecf";
76         Node[] tree = new  Node[preOrder.length()];
77         rebuild(preOrder,inOrder,tree,0);
78         System.out.println("重建的树为:");
79         for(int i=0;i<tree.length;i++){
80             String left,right;
81             if(tree[i].left!=-1)
82                 left = String.valueOf(tree[tree[i].left].value);
83             else
84                 left = null;
85             if(tree[i].right!=-1)
86                 right = String.valueOf(tree[tree[i].right].value);
87             else
88                 right = null;
89             System.out.println(tree[i].value+" 左子树:"+left+" 右子树:"+right);
90         }
91     }
92
93 }

程序运行结果如下:

重建的树为:
a 左子树:b 右子树:c
b 左子树:d 右子树:null
d 左子树:null 右子树:null
c 左子树:e 右子树:f
e 左子树:null 右子树:null
f 左子树:null 右子树:null
时间: 2024-08-05 11:40:31

第3章 结构之法——重建二叉树的相关文章

第3章 结构之法——字符串移位包含的问题

字符串移位包含的问题 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter3jiegouzhifa.QuestionOfStringMove; 2 /** 3 * 字符串移位包含的问题 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringMove { 9 /** 10 * 寻找移位后的字串(左移) 11 * @param src 源字符串 12 * @param des 要查找的子串 13 * @ret

程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题

#include<iostream> #include<vector> using namespace std; class stack { private: vector<int> vec;//用来保存当前进栈的值 vector<int> max_vec; public: void push(int a) { vec.push_back(a); if(max_vec.size()==0||a>vec[max_vec[max_vec.size()-1]

第3章 结构之法——电话号码对应英语单词

电话号码对应英语单词 问题描述 分析与解法 详细代码如下: 1 package chapter3jiegouzhifa.TelephoneMapWords; 2 /** 3 * 电话号码对应英语单词 4 * @author DELL 5 * 6 */ 7 public class TelephoneMapWords1 { 8 private int telLength; //电话号码的位数 9 private char c[][]={ //各个数字所能代表的字符 10 "".toCha

第3章 结构之法——计算字符串的相似度

计算字符串的相似度 问题描述 分析与解法 具体代码如下: 1 package chapter3jiegouzhifa.StringSimilarity; 2 /** 3 * 计算字符串的相似度 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringSimilarity { 9 public static int CalculateStringDistance(String str1, int b1, int e1, String str

第三章结构之法--------字符串移位包含

字符串移位包含的问题 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含. 例如,给定s1=AABCD和s2=CDAA,s1可以通过向右移动两位,s1------>BCDAA,使得s1包含s2,返回true. 而对于s1=ABCD和s2=ACBD,无论s1怎么移动,都无法包含s2,则返回false. 分析与解法 解法1: 这一道题,一开始我并没有想到什么好的解题思路.首先想到的是用暴力枚举的方法,将所有移位后字符串都 列举出来,在进行判断.并且移动的次

ACM 重建二叉树

重建二叉树 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法). 输出 每组输出数据单独占一行,输出对应得先序序列. 样例输入 ACBFGED ABCDEFG CDAB CBAD 样例输出 DBACEGF BCAD

二叉树(14)----由前序遍历和中序遍历重建二叉树

1.二叉树定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t *m_pElemt; struct BTreeNode_t_ *m_pLeft; struct BTreeNode_t_ *m_pRight; } BTreeNode_t; 二.根据前序遍历序列和中序遍历序列重建二叉树 算法说明: 由中序遍历序

重建二叉树-牛客网-剑指offer

1.问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 2.问题分析 2.1首先了解二叉树的结构 2.2了解二叉树的三种遍历顺序(前序遍历,中序遍历和后序遍历) 前序遍历:中左右 中序遍历:左中右 后序遍历:左右中 根据前序遍历序列和中序遍历序列,或后序遍历序列和中序遍历序列,能唯一确定二叉树. 2.3

笔试算法题(36):寻找一棵二叉树中最远节点的距离 &amp; 根据二叉树的前序和后序遍历重建二叉树

出题:求二叉树中距离最远的两个节点之间的距离,此处的距离定义为节点之间相隔的边数: 分析: 最远距离maxDis可能并不经过树的root节点,而树中的每一个节点都可能成为最远距离经过的子树的根节点:所以计算出以每个节点为根节点的子树的最 远距离,最后取他们的最大值就是整棵树的最远距离: 如果递归层次过多造成系统栈溢出,则可以使用stack堆栈结构存储递归节点,从而使用循环实现 解题: 1 struct Node { 2 int value; 3 Node *left; 4 Node *right