二叉树(C++)的简单问题,希望那位朋友能帮忙细说一下,酌情另加分!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树(C++)的简单问题,希望那位朋友能帮忙细说一下,酌情另加分!相关的知识,希望对你有一定的参考价值。

下面是我定义的一个二叉树类,我的问题在最下面的main()函数里面
//二叉树类
#include<iostream>
using namespace std;
template<class T>class BinaryTreeNode;
template<class T>//class BinaryTree;
class BinaryTree
private:
BinaryTreeNode<T>* root;
BinaryTreeNode<T>* current;
public:
BinaryTree()

root=0;

BinaryTree<T>(T data ,BinaryTree<T>& ltree,BinaryTree<T>& rtree)

root=new BinaryTreeNode<T>(T data,ltree.root,rtree.root)
ltree=0;
rtree=0;

T getRightchild()

BinaryTreeNode* p;
p=root;
return p->right->getValue();

~BinaryTree<T>()

deleteBinaryTreeNode(root);

deleteBinaryTree(BinaryTreeNode* root)

if(root)

deleteBinaryTree(root->leftchild);//递归不怎么懂
deleteBinaryTree(root->rightchild);
delete root;


;

template<class T>//class BinaryTreeNode;
class BinaryTreeNode
friend class BinaryTreeNode<T>;
private:
T element;
BinaryTreeNode<T>* leftchild;
BinaryTreeNode<T>* rightchild;
public:
BinaryTreeNode<T>(T data,BinaryTreeNode<T>* lchild=0,BinaryTreeNode<T>* rchild=0)

element=data;
leftchild=lchild;
rightchild=rchild;

T getValue()

return element;

void setLeftchild()//这两个函数其实可以在二叉树中声明

T data;
cout<<"设置二叉树左孩子"<<endl;
cout<<"输入左孩子的值"<<endl;
cin>>data;
leftchild->element=data;

void setRightchild()

T data;
cout<<"设置二叉树右孩子"<<endl;
cout<<"输入右孩子的值"<<endl;
cin>>data;
rightchild->element=data;


;

void main()

BinaryTree<int> T,T1,T2;
BinaryTreeNode<int> B1,B2;
下面这两行代码我的意思是想建立一个根节点为1,左右孩子分别为2.3的数但是报错显示“term does not evaluate to a function”请问这是怎么回事?建立的二叉树类应该怎样实例化?还有为什么我的main函数如果写在类前面在调用类时就会显示,初始化对象引用的类未被定义,这是怎么回事?调用类和调用函数不是一样的吗?
T1(1),T2(2)
T(1,T(1),T(2));

T(1,B1(2),B2(3))
std::cout<<"==="<<T.getRightchild()<<"==="<<endl;

你这样的写法只能在定义对象的语句里面来用的,因为其相当于调用了构造函数,不能当作普通函数来使用。 参考技术A T1(1),T2(2)
T(1,T(1),T(2));

T(1,B1(2),B2(3))
你这样的写法只能在定义对象的语句里面来用的,因为其相当于调用了构造函数,不能当作普通函数来使用。

已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧

数据结构树的遍历

/* 树中已知先序和中序求后序。

如先序为:abdc,中序为:bdac .

则程序可以求出后序为:dbca 。此种题型也为数据结构常考题型。

算法思想:先序遍历树的规则为中左右,则说明第一个元素必为树的根节点,比如上例

中的a就为根节点,由于中序遍历为:左中右,再根据根节点a,我们就可以知道,左子树包含

元素为:db,右子树包含元素:c,再把后序进行分解为db和c(根被消去了),然后递归的

进行左子树的求解(左子树的中序为:db,后序为:db),递归的进行右子树的求解(即右

子树的中序为:c,后序为:c)。如此递归到没有左右子树为止。

关于“已知先序和后序求中序”的思考:该问题不可解,因为对于先序和后序不能唯一的确定

中序,比如先序为 ab,后序为ba,我只能知道根节点为a,而并不能知道b是左子树还是右子树

,由此可见该问题不可解。当然也可以构造符合中序要求的所有序列。

*/

#include <stdio.h>
#include <string.h>

int find(char c,char A[],int s,int e) /**//* 找出中序中根的位置。 */



int i;

for(i=s;i<=e;i++)

if(A[i]==c) return i;



/**//* 其中pre[]表示先序序,pre_s为先序的起始位置,pre_e为先序的终止位置。 */

/**//* 其中in[]表示中序,in_s为中序的起始位置,in_e为中序的终止位置。 */

/**//* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]构成的后序序列。 */

void pronum(char pre[],int pre_s,int pre_e,char in[],int in_s,int in_e)



char c;

int k;

if(in_s>in_e) return ; /**//* 非法子树,完成。 */

if(in_s==in_e)printf("%c",in[in_s]); /**//* 子树子仅为一个节点时直接输出并完成。 */

return ;



c=pre[pre_s]; /**//* c储存根节点。 */

k=find(c,in,in_s,in_e); /**//* 在中序中找出根节点的位置。 */

pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /**//* 递归求解分割的左子树。 */

pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /**//* 递归求解分割的右子树。 */

printf("%c",c); /**//* 根节点输出。 */



void main()



char pre[]="abdc";

char in[]="bdac";

printf("The result:");

pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);

getchar();

参考资料:http://bidlcy514.blog.163.com/blog/static/1054919432010420103312168/

参考技术A 1. 根据前序序列的第一个元素建立根结点;
2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在前序序列中确定左右子树的前序序列;
4. 由左子树的前序序列和中序序列建立左子树;
5. 由右子树的前序序列和中序序列建立右子树
这样递归下去,当取完中序序列中的节点时,就可以得到一颗二叉树。
然后再根据后序遍历,得到你所需要的二叉树。
参考技术B 已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C 的,要在TC环境下能运行的,各位能人帮帮忙吧
开机喜事到,向您问个好,办事处处顺,生活步步高,彩票期期中,好运天天交,打牌场场胜,口味顿顿2好,越活越年轻。

以上是关于二叉树(C++)的简单问题,希望那位朋友能帮忙细说一下,酌情另加分!的主要内容,如果未能解决你的问题,请参考以下文章

下次面试若再被问到二叉树,希望你能对答如流!

细说二叉树

试写一个程序,实现二叉树遍历的应用。

二叉树8:对称二叉树

编写一个程序,实现二叉树的各种基本运算

常见数据结构——完全二叉树(定义特征节点个数的判断以及C++简单实现)