编程之美---重建二叉树

学过数据结构和算法的人都能很快的写出二叉树的三种遍历次序。
     那么如果已经知道了遍历的结果,能不能把一颗二叉树重新构造出来呢?

 1 //定义树的长度
 2 #define TREELEN 6
 3 #include<iostream>
 4 using namespace std;
 5
 6 struct Node
 7 {
 8     struct Node* pLeft;
 9     struct Node* pRight;
10     char value;
11 };
12
13 void Rebuild(char *pPreOrder,//前序遍历结果
14              char *pInorder,//中序遍历结果
15              int nTreeLen,//树的长度
16              Node **pRoot)//根节点
17 {
18     //检查边界条件
19     if(pPreOrder==NULL ||pInorder==NULL)
20     {
21         return ;
22     }
23     //获得前序遍历的第一个结点
24     Node *pt=new Node ;
25     pt->value=*pPreOrder;
26     pt->pLeft=NULL;
27     pt->pRight=NULL;
28     //如果根节点为空,将该节点设置为根节点,首次会调用
29     if(*pRoot==NULL)
30     {
31         *pRoot=pt;
32     }
33     //如果深度为1,那么已经是叶节点了
34     if(nTreeLen==1)
35     {
36         return;
37     }
38     //在中序遍历中寻找左子树
39     char *pOrgInOrder=pInorder;
40     char *pLeftEnd=pInorder;
41     int ntemp=0;
42     //找到左子树的结尾
43     while(*pPreOrder!=*pLeftEnd)
44     {
45         if(pPreOrder==NULL||pLeftEnd==NULL)
46         {
47             return;
48         }
49         ntemp++;
50         if(ntemp>nTreeLen)
51         {
52             return;
53         }
54         pLeftEnd++;
55     }
56     //确定左子树的长度
57     int nLeftLen=0;
58     nLeftLen=(int)(pLeftEnd-pOrgInOrder);
59     //确定右子树的长度
60     int nRightLen=0;
61     nRightLen=nTreeLen-nLeftLen-1;
62
63     //重建左子树
64     if(nLeftLen>0)
65     {
66         Rebuild(pPreOrder+1,pInorder,nLeftLen,&((*pRoot)->pLeft));
67     }
68     //重建右子树
69     if(nRightLen>0)
70     {
71         Rebuild(pPreOrder+nLeftLen+1,pInorder+nLeftLen+1,nRightLen,&((*pRoot)->pRight));
72     }
73 }
74
75 int main()
76 {
77     char PreOrder[]={‘a‘,‘b‘,‘d‘,‘c‘,‘e‘,‘f‘};
78     char InOrder[]={‘d‘,‘b‘,‘a‘,‘e‘,‘c‘,‘f‘};
79     Node *root=NULL;
80     Rebuild(PreOrder,InOrder,TREELEN,&root);
81 }

时间: 2024-08-05 19:31:59

编程之美---重建二叉树的相关文章

剑指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

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

#include<iostream> using namespace std; //二叉树 节点结构 typedef struct TNODE_ { int data; struct TNODE_*left; struct TNODE_*right; }TNode; //获取树的高度=路径+1(最长路径经过的边数+1) int GetLRDistance(TNode*t) { int len=0; if(t==NULL) { return 0; }else{ int lenL=GetLRDis

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

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 解法:用递归的方法 1 // 数据结构定义 2 struct NODE 3 { 4 NODE* pLeft; // 左子树 5 NODE* pRight; // 右子树 6 int nMaxLeft; // 左子树中的最长距离 7 int nMaxRight; // 右子树中的最长距离 8 char chValue; // 该节点

【编程之美】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

编程之美——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