【编程之美】3.9重建二叉树

题目:

给定一棵二叉树,假定每个节点都用唯一的字符表示,具体结构如下:

struct NODE {
  NODE* pLeft;
  NODE* pRight;
  char chValue;
};

假设已经有了前序遍历和中序遍历结果,希望通过一个算法重建这棵树。
    给定函数的定义如下:

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot);

参数
    pPreOrder:前序遍历结果的字符串数组。
    pInOrder: 中序遍历结果的字符串数组。
    nTreeLen: 树的长度。
    pRoot:     根据前序和中序遍历结果重新构建树的根节点。
    例如
    前序遍历结果:a b d c e f
    中序遍历结果:d b a e c f

思路:不难,根据前序遍历结果找跟,根据中序遍历结果划分左右子树,递归求解。

/*
start time = 15:55
end time = 16:23
*/
#include<iostream>
using namespace std;

typedef struct NODE{
    NODE *pLeft, *pRight;
    char chValue;
}NODE;

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot)
{
    if(pPreOrder == NULL || pInOrder == NULL) //边界条件不要忘了 这是看答案后补上的
    {
        return;
    }
    if(nTreeLen <= 0)
    {
        return;
    }
    //重建根节点 一定是先序遍历的第一个值
    *pRoot = new NODE;
    (*pRoot)->chValue = pPreOrder[0];
    (*pRoot)->pLeft = NULL;
    (*pRoot)->pRight = NULL;

    //查找根在中序遍历中的位置,把中序遍历表转化为左子树和右子树两个部分
    int iLocateRoot;
    for(iLocateRoot = 0; iLocateRoot < nTreeLen; iLocateRoot++)
    {
        if(pInOrder[iLocateRoot] == pPreOrder[0])
        {
            break;
        }
    }

    //重建左子树
    Rebuild(pPreOrder+1, pInOrder, iLocateRoot, &((*pRoot)->pLeft));
    //重建右子树
    Rebuild(pPreOrder+iLocateRoot+1, pInOrder + iLocateRoot + 1, nTreeLen - iLocateRoot - 1, &((*pRoot)->pRight));
}

int main()
{
    char pre[7] = {‘a‘,‘b‘,‘d‘,‘c‘,‘e‘,‘f‘,‘\0‘};
    char in[7] = {‘d‘,‘b‘,‘a‘,‘e‘,‘c‘,‘f‘,‘\0‘};
    NODE * T = NULL;
    Rebuild(pre, in, 7, &T);

    return 0;
}
时间: 2024-12-12 10:07:47

【编程之美】3.9重建二叉树的相关文章

编程之美——3.8求二叉树中结点的最大距离(树,递归,动态规划)

<编程之美>读书笔记12: 3.8 求二叉树中节点的最大距离 问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 实际上就是求树的直径.若采用“动态规划方法”思想,会将该问题分解成“具有最大距离两点间的路径是否经过根节点”两个子问题,然后再对这两个子问题求解判断.实际上,不必这么麻烦.距离最远的两点必然在以某个节点A为根的子树上,它们间的路径必然经过该子树的根节

【编程之美】java实现重建二叉树

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

编程之美-分层遍历二叉树

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <span style="font-size:14px;">1 2 3 4 5 6 7 8</span> 书中还给出了问题2:打印二叉树中的某层次的节点(从左到右),其中根结点为第0层,成功返回true,失败返回false 分析与解法 关于二叉树的问题,由于其本身固有的

编程之美问题之二叉树层序遍历多种解法

二叉树的层序遍历(要求区分层,例如每层遍历完输出换行) 单单层序遍历非常简单,一个队列就搞定了,但是区分层则要麻烦些.总的思路无非就是在每次print的时候,要能通过某个东西 区分出当前节点是否是一层最后一个节点,或者下一层的最后一个节点,感觉有点类似于机器学习中找个区分度明显的特征: 1.自己的解法,在单队列基础上,输入队列的数据添加一个标志 ,LevelHeaded,同时,在后面插入两个孩子的时候,判断是否这次输出的是队头,如果是的话,先插 个队头标志,再插入孩子,而且插入一次之后,后面不能

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

【编程之美】java二进制实现重建

package com.cn.binarytree.utils; /** * @author 刘利娟 [email protected] * @version 创建时间:2014年7月20日 下午2:03:30 类说明: */ class Node { Node left; Node right; char chValue; Node(char chValue) { left = null; right = null; this.chValue = chValue; } } public cla

剑指Offer_编程题之重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 原文地址:https://www.cnblogs.com/yuqiujie/p/9051667.html

[编程题]重建二叉树

题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 代码: function reConstructBinaryTree(pre, vin) { // write code here var result =null; if(pre.length>1){ var root = pre[0]; var

编程之美之买票找零

题目:假设有2N个人在排队买票,其中有N个人手持50元的钞票,另外有N个人手持100元的钞票,假设开始售票时,售票处没有零钱,问这2N个人有多少种排队方式,不至使售票处出现找不开钱的局面? 分析:队伍的序号标为0,1,...,2n-1,并把50元看作左括号,100元看作右括号,合法序列即括号能完成配对的序列.对于一个合法的序列,第0个一定是左括号,它必然与某个右括号配对,记其位置为k.那么从1到k-1.k+1到2n-1也分别是两个合法序列.那么,k必然是奇数(1到k-1一共有偶数个),设k=2i

【编程之美】目录

第1章  游戏之乐——游戏中碰到的题目 1.1 让CPU占用率听你的指挥 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 1.4 买书问题 第2章  数字之魅——数字中的技巧 2.1 求二进制中1的个数 2.2 不要被阶乘吓倒 2.3 寻找发帖"水王" 2.4 1的数目 2.5 寻找最大的K个数 2.6 精确表达浮点数 2.7 最大公约数问题 2.8 找符合条件的整数 2.9 斐波那契(Fibonacci)数列 2.10 寻找数组中的最大值和最小值 2.11 寻找最近点对 2.12