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

数据结构二叉树题目

发布网友 发布时间:2022-05-29 20:02

我来回答

2个回答

热心网友 时间:2023-11-18 05:59


下面是c++的代码。 主要是一个递归的思维。收好都是我自己写的,能用

//BinTree.h  定义

struct Node 
{
int data;
Node *lchild,*rchild;
};
class BinTree  
{
        Node *Root;
public:
BinTree();
BinTree(char pre[]);
BinTree(char pre[],char mid[],int n);
virtual ~BinTree();
void PreOrder();
void MidOrder();
void PostOrder();
Node * Search(int x);
int Count();
int LeafCount();
int Depth();
private:
void PreOrder(Node *p);
void MidOrder(Node *p);
void PostOrder(Node *p);
Node * Search(Node *p, int x);
int Count(Node *p);
int LeafCount(Node *p);
int Depth(Node *p);
Node *CreateByPre(char pre[],int &i);
Node *CreateByPreMid(char pre[],int ipre, char mid[], int imid,int n);
};

//BinTree.cpp 

// BinTree.cpp: implementation of the BinTree class.
#include "BinTree.h"
BinTree::BinTree()  //无参构造函数
{
Root = NULL;
}
BinTree::BinTree(char pre[])  
{
int i = 0;
Root = CreateByPre(pre, i);
}
Node *BinTree::CreateByPre(char pre[], int &i)
{
char c = pre[i];    i++;
if(c == '*')  return NULL;
Node *p = new Node;p->data = c-'0';
p->lchild = CreateByPre(pre, i);
p->rchild = CreateByPre(pre, i);
return p;
}
//根据先序序列中序序列 创建二叉树
BinTree::BinTree(char pre[], char mid[], int n)
{
Root = CreateByPreMid(pre, 0, mid, 0, n);
}
//先序序列: pre[ipre]...pre[ipre+n-1]
//中序序列: mid[imid]...mid[imid+n-1]
Node *BinTree::CreateByPreMid(char pre[], int ipre, char mid[], int imid, int n)
{
if(n <= 0)  return NULL;
    Node *p = new Node;  p->data = pre[ipre] - '0';
for(int i = 0; i < n; i++)
if(mid[imid+i] == pre[ipre])
break;
//先序序列: pre[ipre] (....pre[ipre+i])  (....pre[ipre+n-1])
//中序序列: (mid[imid]....) mid[imid+i]  (.....mid[imid+n-1])
p->lchild = CreateByPreMid(pre,ipre+1,   mid, imid,     i    );
p->rchild = CreateByPreMid(pre,ipre+i+1, mid, imid+i+1, n-i-1);
return p;
}
BinTree::~BinTree()
{}
void BinTree::PreOrder()
{
PreOrder(Root);  //先序遍历
cout << endl;
}
void BinTree::PreOrder(Node *p)
{
if(p == NULL)  return;
cout << p->data << "  ";
PreOrder(p->lchild);  //先序遍历左子树
PreOrder(p->rchild);  //先序遍历右子树
}
void BinTree::MidOrder()
{
MidOrder(Root);  //中序遍历
cout << endl;
}
void BinTree::MidOrder(Node *p)
{
if(p == NULL)  return;
MidOrder(p->lchild);  //中序遍历左子树
cout << p->data << "  ";
MidOrder(p->rchild);  //中序遍历右子树
}
void BinTree::PostOrder()
{
PostOrder(Root);  //中序遍历
cout << endl;
}
void BinTree::PostOrder(Node *p)
{
if(p == NULL)  return;
PostOrder(p->lchild);  //后序遍历左子树
PostOrder(p->rchild);  //后序遍历右子树
cout << p->data << "  ";
}
//深度,即二叉树的高度
int BinTree::Depth()
{
    return Depth(Root);
}
int BinTree::Depth(Node *p)
{
    if(p == NULL) return 0;
    int left = Depth(p->lchild);
    int right = Depth(p->rchild);
    if(left > right)
        return left  + 1;
    else
    return right + 1;
}
//查询值x的节点
Node * BinTree::Search(int x)
{
    return Search(Root,x);
}
Node * BinTree::Search(Node *p, int x)
{
    if(p == NULL)    return NULL;
    if(p->data == x) return p;
    Node *q = Search(p->lchild,x);  //按照先序 查找左子树
    if(q != NULL)    return q;
    return Search(p->rchild,x);  //按照先序 查找右子树
}
//所有节点个数
int BinTree::Count()
{
    return Count(Root);
}
int BinTree::Count(Node *p)
{
    if(p==NULL)  return 0;
    int left = Count(p->lchild);  
    int right= Count(p->rchild);  
    return left+right+1;
}
//所有叶子节点的个数
int BinTree::LeafCount()
{
return LeafCount(Root);
}
int BinTree::LeafCount(Node *p)
{
if(p==NULL)  return 0;
if(p->lchild==NULL && p->rchild==NULL)  return 1;
int left =LeafCount(p->lchild);  
int right=LeafCount(p->rchild);  
return left+right;
}




热心网友 时间:2023-11-18 05:59

class TreeNode{
int val;
//左孩子
TreeNode left;
//右孩子
TreeNode right;
}

二叉树的题目普遍可以用递归和迭代的方式来解

1. 求二叉树的最大深度

int maxDeath(TreeNode node){
if(node==null){
return 0;
}
int left = maxDeath(node.left);
int right = maxDeath(node.right);
return Math.max(left,right) + 1;
}

2. 求二叉树的最小深度

int getMinDepth(TreeNode root){
if(root == null){
return 0;
}
return getMin(root);
}
int getMin(TreeNode root){
if(root == null){
return Integer.MAX_VALUE;
}
if(root.left == null&&root.right == null){
return 1;
}
return Math.min(getMin(root.left),getMin(root.right)) + 1;
}

3. 求二叉树中节点的个数

int numOfTreeNode(TreeNode root){
if(root == null){
return 0;
}
int left = numOfTreeNode(root.left);
int right = numOfTreeNode(ro
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
M&amp;G 晨光 48K线装本-适用对象 M&amp;G 晨光 A5纸质笔记本棕色 - 购买最佳价格 欧伦A5线装本棕色-适用对象 得力FA530 A5/30张小学生作业本簿-性价比最高的纸质笔记本 kinbor DTB40103 线装本 灰色 单本-适合所有需要记录和管理的人群_百度... 得力颐和园系列皮面记事本,实用与收藏价值兼具 写尚A5线装本蜡感鹿头经典款黑色360页G15黑笔礼盒装-高端大气上档次 乔先生 康奈尔笔记本 曜石黑 A4方格版 纸质笔记本推荐 Amari阿玛瑞QS-008 2020年日程本-金华盛纸纸质笔记本推荐 CHOGORI笔记本-高品质A5纸质笔记本,236页米黄色道林纸,多色可选... 齐B小短裙到底想表达什么意思 谁知道齐b小短裙是什么意思?? 最近一直看到齐B小短裙这词,到底什么意思? 严肃的请教何谓“齐B小短裙”? 网络新词:什么是齐B小短裙 百度账号在哪里可以改名字啊 及时报告医疗器械不良事件有什么意义? (申士圣阅)[讨论][求助]不良事件与重要不良事件的区别 什么原因,导致你对另一半彻底失望? 神奥地区神柱在哪 女孩子对另一半特别失望的时候,她为什么不理对方? 有哪些口袋妖怪的游戏地图与丰缘和方元地区的地图不一样 口袋妖怪黑白2如何到神奥地区 女孩子对另一半特别失望的时候,会变的沉默吗? 求神奇宝贝地图 大图 你在什么时候会对自己的另一半产生失望的情绪? 口袋妖怪里面那些版本地图一样的呢,需要比较完整的,最好包括了所有的版本 谁能给我神奇宝贝新奥 神奥 丰缘 关东 成都等地区的地图啊 谢谢! 为什么人都会对自己的另一半感觉到失望呢? 阿尔宙斯一共有几个地图 关于二叉树的题目怎么做 一道二叉树的题。 这道有关二叉树的题目怎么做? 关于二叉树的一个题目 有关二叉树的问题 求 死亡作业 百度云资源,谢谢 双踏板摩托车刚买能不能开80码 死亡作业好看不? 怎么看乐平小学哪个好 死亡作业三统领叫什么呢 双健踏板摩托车125的多少钱,哪位大神知道价格? 江西省乐平市安监局.电工证怎样查 谁帮我查下这个单号的快递我查不了181113049604 长宇的 请问我的三和YX360TRF型指针万用表各电阻挡都不能复〇并电压也测量不准了是否? EXCEL里面怎么批量一次性删除这一排图片? 考研 旅游规划和财务管理那个就业前景好点? 想考首都师范大学人文地理旅游规划方向研究生,请问哪个导师好呢?旅游规划方向招多少人呢? windows 的 sockaddr 和 linux 的sockaddr 有区别吗 旅游地理与旅游规划 有哪个学校招收在职研究生或者专业硕士的么 求读者2006年第七期关于爱情的一篇文章