问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++程序求二叉树以x为根的子树的深度 最好是能输入二叉树 然后输出树形再输入x

发布网友 发布时间:2023-01-05 08:01

我来回答

2个回答

热心网友 时间:2023-10-15 11:37

// tieba.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include<stdlib.h>
#include "stdio.h"

template<class T>
struct BTNode
{
T data;
BTNode<T> *lChild,*rChild;
BTNode();
BTNode(const T &val,BTNode<T> *Childl=NULL,BTNode<T> *Childr=NULL)
{
data=val;
lChild=Childl;
rChild=Childr;
}
BTNode<T>* CopyTree()
{
BTNode<T> *nl,*nr,*nn;
if(&data==NULL)
return NULL;
nl=lChild->CopyTree();
nr=rChild->CopyTree();
nn=new BTNode<T>(data,nl,nr);
return nn;
}
};
template<class T>
BTNode<T>::BTNode()
{
lChild=rChild=NULL;
}
template<class T>
class BinaryTree
{
public:
BTNode<T> *root;
BinaryTree();
~BinaryTree();
void Pre_Order();
int TreeDepth(BTNode<T> *r)const;

void DestroyTree();
BTNode<T>* MakeTree(const T &element,BTNode<T> *l,BTNode<T> *r)
{
root=new BTNode<T>(element,l,r);
if(root==NULL)
{
printf("申请存贮地址失败,系统将关闭进程/n");
return NULL ;
}
return root;
}
BinaryTree<T> *cre_tree(char *str,int i,int m);
private:

void Destroy(BTNode<T> *&r);
void PreOrder(BTNode<T> *r);
int Depth(BTNode<T> *r,char x);
int GetDepth(BTNode<T>*bt);
};
template<class T>
BinaryTree<T>::BinaryTree()
{
root=NULL;
}
template<class T>
BinaryTree<T>::~BinaryTree()
{
DestroyTree();
}
template<class T>
void BinaryTree<T>::Pre_Order()
{
PreOrder(root);
}
template<class T>
int BinaryTree<T>::GetDepth(BTNode<T> *bt)
{
int m,n; //记录返回的个数
if(bt) //非空执行
{
m=GetDepth(bt->lChild); //对左子树递归
n=GetDepth(bt->rChild); //对右子树递归
return (m>=n?m+1:n+1); //返回最深的度数
}
else //bt空,返回0
return 0;
}
template<class T>
int BinaryTree<T>::TreeDepth(BTNode<T> *r)const
{
/*
求树的深度的方法有问题,添加一个变量r,表示要求的树的根
*/
if(r==NULL)
return 0;
else
{
int h1=TreeDepth(r->lChild);
int h2=TreeDepth((r->rChild));
int h=(h1>h2 ?h1:h2)+1;
return h;
}
}
template<class T>
void BinaryTree<T>::DestroyTree()
{
Destroy(root);
}
template<class T>
void BinaryTree<T>::PreOrder(BTNode<T> *r)
{
if(r!=NULL)
{
printf("%d",r->data);
printf(" ");
PreOrder(r->lChild);
PreOrder(r->rChild);
}
}
template<class T>
int BinaryTree<T>::Depth(BTNode<T> *r,char x)
{
int m,n;
if(!r) //空,返回0
return 0;
if(r->data==x) //找到r,求r的深度
return GetDepth(r); //返回r的深夜
else
{
if(r->lchild) //向左子树找r
m=Depthx(r->lchild,x);
if(r->rchild) //向右子树找r
n=Depthx(r->rchild,x);
}
return (m>=n?m:n); //返回向下递归的最大深度
}

template<class T>
void BinaryTree<T>::Destroy(BTNode<T> *&r)
{
if(r!=NULL)
{
Destroy(r->lChild);
Destroy(r->rChild);
delete r;
r=NULL;
}
}
/*另外你的maketree貌似也不行,赠上这个建树的,char *里存树节点的字符*/
template<class T>

BinaryTree<T> *BinaryTree<T>::cre_tree(char *str,int i,int m)

{BinaryTree<T> *p;
BinaryNode r;
if(i>=m)

return NULL;

p=(BinaryTree<T> *)malloc(sizeof(bitree)); /生成新节点
r.data=str[i];
p->setRoot(r); //j将第一个节点赋值

p->getRoot()->SetLeft(cre_tree(str,2*i+1,m)); //创建新节点的左子树

p->getRoot()->SetRight(cre_tree(str,2*i+2,m)); //创建新节点右子树

return p;

}

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

char x;
BTNode<char> *b,*c,*d,*e,*f,*g;
BinaryTree<char> a;
b=a.MakeTree('F',NULL,NULL);
c=a.MakeTree('E',NULL,NULL);
d=a.MakeTree('D',NULL,NULL);
e=a.MakeTree('C',b,NULL);
f=a.MakeTree('B',d,c);
g=a.MakeTree('A',f,e);
printf("前序遍历:");
a.Pre_Order();
printf("\n");
printf("x的值是:");
cin>>x;
printf("以x为根的子树的深度是:");
printf("%d",a.TreeDepth(a.root));
cout<<endl;
//如果你不加上using namespace 只能用scanf 和printf

getchar();
getchar();
getchar();
return 0;

}

//这样可以运行了,再有问题再说吧

热心网友 时间:2023-10-15 11:37

2分到手,天下我有~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
初中英语语法讲解:名词所有格 关于名词所有格一问 暗区突围画面怎么设置最好-暗区突围画面设置推荐 暗区突围打开的箱子怎么关上 保险箱关闭攻略 暗区突围 暗区突围画面设置怎么弄最佳? 暗区突围 暗区突围光影怎么调? 暗区突围 暗区突围中间白点怎么设置? 暗区突围灵敏度怎么调最稳 暗区突围灵敏度最佳设置方法 我的WIN7 64位系统无法安装打印机HP1136,请支持啊,急。驱动下载也没用... win7电脑连接不上惠普打印机Win7系统安装不了惠普HP1007打印机 计算机常用英语词汇 —— 数据结构与算法 健身房会看到男生穿紧身裤,再套个短裤,是否真的有必要这样穿? 可以直接穿着紧身运动裤去学校吗?会不会有点*,我怕女生看着会害羞,但我特别喜欢这种紧绷肌肉的感觉 暴走英雄坛伤害1.1是什么意思 教学思路和教学过程有什么区别 教学思路包括什么内容? 过新年作文700字三篇 String 与 Date之间的转换 函数发生器的使用方法 异地入党算不算严重违规 &quot;黄梅时节家家雨 青草池塘处处蛙&quot; 轰字的笔顺 程力五方酒水车配置都有什么洒水车 手机相册贴纸不能用红米 哈苏H6D数码后背单元使用方法,摄影爱好者的必修课 h5d能不能用h6d后背 哈苏4亿像素有多恐怖 怎么做清香的小鸡炖蘑菇 红梅时节家家雨青草池塘处处蛙的后两句 剑王朝丁宁最后到八境了吗 剑王朝丁宁最后境界 华为手机厂址? 永康的公务员住房公积金多少 永康二中教师待遇 长治和平医院看脉管炎挂哪个科号 长治医学院附属医院有几个 和平医院? 教学思路和教学过程一样吗 教学思路和教学过程的区别 善养吾浩然之气体现的中华传统美德的基本精神是 晚饭4点多买的米线 剩一些放在所料袋里捂着一直到现在 还能吃了吗? UG8.0组装机的配置 求教UG软件组装方法? 总裁厨子是什么电视剧 什么是教学思路 通俗易懂的讲解 如何申请鹤煤医保卡 侠盗猎车手罪恶都市现在在哪可以下载? AI医疗神助攻! 智慧影像诊断更精准 实惠卧室电视 索尼32寸BX320售2299元 智慧人社证后图像怎样才能在页面上显示? 智慧视觉识别的图片会被别人看到吗?