给定一棵二叉树的前序遍历和中序遍历,如何还原这棵树?下面是这棵树的结构体:
struct node{
char data;
node * lchild;
node *rchild;
}
正在学习数据结构与算法,但是本人实在没有天赋,这个最简单的问题困扰了我一个星期了。
需要详细的步骤和注释。从详细说明书面口头语言到具体代码的实现。
注释请包含每一个变量(哪怕是写在循环里面的变量)的作用,以及为什么会想到这个变量。
感激不尽!
网上有很多类似的,可以参考
#include <iostream>
#include <cstring>
using namespace std;
struct node {
char data;
node *lchild;
node *rchild;
};
// 根据前序遍历和中序遍历还原二叉树
node *buildTree(char *preorder, char *inorder, int len) {
if (len <= 0) return NULL;
// 创建根节点
node *root = new node;
root->data = *preorder;
root->lchild = NULL;
root->rchild = NULL;
// 在中序遍历中找到根节点的位置
int rootPos = 0;
while (*(inorder + rootPos) != *preorder) {
rootPos++;
}
// 递归构建左子树和右子树
root->lchild = buildTree(preorder + 1, inorder, rootPos);
root->rchild = buildTree(preorder + rootPos + 1, inorder + rootPos + 1, len - rootPos - 1);
return root;
}
// 后序遍历输出二叉树
void postorder(node *root) {
if (root == NULL) return;
postorder(root->lchild);
postorder(root->rchild);
cout << root->data << " ";
}
int main() {
char preorder[] = "ABDECF";
char inorder[] = "DBEAFC";
int len = strlen(preorder);
// 构建二叉树
node *root = buildTree(preorder, inorder, len);
// 后序遍历输出二叉树
postorder(root);
return 0;
}
注释如下:
struct node
:定义了二叉树的结构体。buildTree
:根据前序遍历和中序遍历还原二叉树的函数。if (len <= 0) return NULL;
:如果长度为0,则返回NULL。node *root = new node;
:创建根节点。root->data = *preorder;
:根节点的值为前序遍历的第一个元素。int rootPos = 0;
:在中序遍历中找到根节点的位置。while (*(inorder + rootPos) != *preorder) { rootPos++; }
:找到根节点的位置。root->lchild = buildTree(preorder + 1, inorder, rootPos);
:递归构建左子树。root->rchild = buildTree(preorder + rootPos + 1, inorder + rootPos + 1, len - rootPos - 1);
:递归构建右子树。postorder
:后序遍历输出二叉树的函数。if (root == NULL) return;
:如果节点为空,则返回。postorder(root->lchild);
:递归输出左子树。postorder(root->rchild);
:递归输出右子树。cout << root->data << " ";
:输出节点的值。main
:主函数。char preorder[] = "ABDECF";
:前序遍历。char inorder[] = "DBEAFC";
:中序遍历。int len = strlen(preorder);
:计算前序遍历的长度。node *root = buildTree(preorder, inorder, len);
:构建二叉树。postorder(root);
:后序遍历输出二叉树。指令由操作码和地址码组成
(1).指令寄存器
指令寄存器就是用来存放从当前的计算机状态的内存中读取出的计算机操作指令
(2).指令译码器
译码器是可以将输入二进制代码的状态翻译成输出信号,以表示其原来含义的电路。eg:根据需要,输出信号可以是脉冲,也可以是高电平或者低电平。
(3).时序电路
定时控制功能
(4).控制电路