[编程实现]重构二叉树

题目

给定一棵二叉树的先序和后序序列,构造出这棵二叉树。假设二叉树中每个节点存放的是不同的字符。如:先序序列为:abdcef,后序序列为:“dbaecf。

思路:

由于二叉树的定义就是递归的,因此很多和二叉树相关的题目都可以递归来实现。

code:

/*
 * =====================================================================================
 *
 *       Filename:  Rebuild.cpp
 *
 *    Description:  Rebuild binary tree based on preorder traversal and inorder traversal
 *
 *        Version:  1.0
 *        Created:  2012年10月07日 00时29分05秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  lonfee88 (), lonfee88@gmail.com
 *        Company:  nlp.whu
 *
 * =====================================================================================
 */
#include<iostream>
using namespace std;

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

void Rebuild(char *pPreOrder, char *pInOrder, int nTreeLen, NODE **pRoot)
{
	cout << "Rebuild" << "(" <<pPreOrder<<"," << pInOrder << ","<<nTreeLen <<")" << endl;
	int i;
	NODE *pLeft=NULL,*pRight=NULL;

	if(nTreeLen>0)
	{
		for(i=0;i<nTreeLen;i++)
			if(pPreOrder[0] == pInOrder[i])
				break;
		cout << i <<endl;
		cout << "\tRebuild left" << "(" <<pPreOrder+1<<"," << pInOrder << ","<<i <<")" << endl;
		Rebuild(pPreOrder+1,pInOrder,i,&pLeft);
		cout << "\tRebuild right" << "(" <<pPreOrder+i+1<<"," << pInOrder+i+1 << ","<<nTreeLen-i-1 <<")" << endl;
		Rebuild(pPreOrder+i+1,pInOrder+i+1,nTreeLen-i-1,&pRight);

		cout << "construct node "<< *pPreOrder << endl;
		*pRoot=new NODE;
		(*pRoot) -> pLeft = pLeft;
		(*pRoot) -> pRight = pRight;
		(*pRoot) -> chValue = *pPreOrder;
	}
}

void preTraversal(NODE *pRoot)
{
	if(pRoot!=NULL)
	{
		cout<<pRoot->chValue;
		preTraversal(pRoot->pLeft);
		preTraversal(pRoot->pRight);
	}
}
void inTraversal(NODE *pRoot)
{
	if(pRoot!=NULL)
	{
		inTraversal(pRoot->pLeft);
		cout<<pRoot->chValue;
		inTraversal(pRoot->pRight);
	}
}
void postTraversal(NODE *pRoot)
{
	if(pRoot!=NULL)
	{
		postTraversal(pRoot->pLeft);
		postTraversal(pRoot->pRight);
		cout<<pRoot->chValue;
	}

}

int main(int argc, char *argv[])
{
	const int TREELEN = 6;
	char szPreOrder[TREELEN] = {'a','b','d','c','e','f'};
	char szInOrder[TREELEN] = {'d','b','a','e','c','f'};

	NODE *pRoot = NULL;
	Rebuild(szPreOrder, szInOrder, TREELEN, &pRoot);

	//NODE **pRoot = NULL;
	//Rebuild(szPreOrder, szInOrder, TREELEN, pRoot);

	cout<<"Verify:"<<endl;
	cout<<"PreOrder:";
	preTraversal(pRoot);
	cout<<endl;
	cout<<"InOrder:";
	inTraversal(pRoot);
	cout<<endl;
	cout<<"PostOrder:";
	postTraversal(pRoot);
	cout<<endl;
	return 0;
}

注意:

1. C++中stuct声明的类型可以不带关键字,如声明NODE如下:
struct NODE
{
	NODE *pLeft;
	NODE *pRight;
	char chValue;
};

后面可以直接用NODE来声明新的变量
	NODE *pLeft=NULL,*pRight=NULL;

而不用像C语言中那样,必须带有stuct关键字,即用stuct NODE来声明新的变量。 这是因为C++把stuct当作类来处理。

2.二级指针初始化的问题
如果想初始化指针的指针为NULL,应该这么来
NODE *pRoot = NULL;
Rebuild(szPreOrder, szInOrder, TREELEN, &pRoot);
初始化之后,可以直接引用*pRoot.
下面这样声明就不能直接引用*pRoot:
NODE **pRoot = NULL;
Rebuild(szPreOrder, szInOrder, TREELEN, pRoot);
总之,把指针当作地址来思考,一切就都解释得通了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是利用二叉树求表达式的值的 C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode, *BinaryTree; // 创建一个节点 TreeNode *createNode(char value) { TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode)); node->data = value; node->left = NULL; node->right = NULL; return node; } // 创建二叉树 BinaryTree createTree() { BinaryTree root = NULL; char value; scanf("%c", &value); if (value != '#') { root = createNode(value); root->left = createTree(); root->right = createTree(); } return root; } // 计算表达式 int evaluate(BinaryTree root) { if (!root) return 0; if (isdigit(root->data)) { return root->data - '0'; } int left = evaluate(root->left); int right = evaluate(root->right); switch (root->data) { case '+': return left + right; case '-': return left - right; case '*': return left * right; case '/': return left / right; default: return 0; } } int main() { BinaryTree root = createTree(); int result = evaluate(root); printf("Result: %d\n", result); return 0; } ``` 代码中,我们使用 `TreeNode` 结构体表示二叉树的节点,其中 `data` 表示节点的值,`left` 和 `right` 分别表示左右子树。使用 `createNode` 函数创建一个新的节点,使用 `createTree` 函数创建二叉树,其中 `#` 表示空节点。 使用 `evaluate` 函数计算表达式的值,如果当前节点的值是数字,直接返回,否则递归计算左右子树的值,并根据当前节点的值进行相应的计算。最后在 `main` 函数中调用 `createTree` 和 `evaluate` 函数,并输出结果。 这是一个简单的例子,对于复杂的表达式,需要使用中缀表达式转后缀表达式等算法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值