目录

1.已知一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值。

2.编写后序遍历的二叉树的非递归算法

3.试给出二叉树的自下而上,从右到左的层次遍历算法。

4.假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。

5.设一颗二叉树中各个节点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A[1...n]和B[1...n]中,试编写算法建立该二叉树的二叉链表。

6.二叉树按二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树的算法。

7.假设二叉树采用二叉链表存储结构存储,试着设计一个算法,计算一颗给定二叉树的所有双分支节点的个数。

8.设树B是一颗采用链式结构存储的二叉树,编写一个把树B中所有节点的左,右子树进行交换的函数。


1.已知一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值。

#include <stdio.h>
#include <malloc.h>
#define MaxSize 13typedef struct TNode
{char data;TNode* lchild;TNode* rchild;
}TNode;int find_public(TNode T[],int i,int j)//注意这里不是TNode* &T
{if(T[i].data!='#'&&T[j].data!='#')//还要判断结点是否存在{while(i!=j){if(i>j)i=i/2;elsej=j/2;}return i;}elsereturn 0;}int main()
{TNode T[MaxSize];for(int i=1;i<MaxSize;i++)//从数组下标1开始存储{char c;scanf("%c",&c);T[i].data=c;}int k=find_public(T,4,10);printf("%c\n",T[k].data);//测试数据:ABCDE####F#,输出data:Breturn 0;
}
/*AB   CD   E  F
*/

2.编写后序遍历的二叉树的非递归算法

//非递归的一个后序遍历二叉树
#include<iostream>
using namespace std;
typedef struct TreeNode{char data;struct TreeNode *lchild,*rchild;int tag;
}TreeNode,*Tree;
void creattree(Tree &t)
{char ch;ch=getchar();if(ch=='#') t=NULL;else{t=(TreeNode *)malloc(sizeof(TreeNode));t->data=ch;t->tag=0;t->lchild=NULL;t->rchild=NULL;creattree(t->lchild);creattree(t->rchild);}
}
void back(Tree t)
{struct TreeNode *stack[100];int top=-1;TreeNode *p=t;TreeNode *x;while(p||top!=-1){if(p){top++;stack[top]=p;p=p->lchild;}else{p=stack[top];if(p->rchild&&p->rchild->tag==0)p=p->rchild;else{p=stack[top];top--;cout<<p->data<<" ";p->tag=1;p=NULL;}}}
}
int main()
{Tree t;creattree(t);back(t);return 0;
}
//ABDEC
//测试:ABD##E##C##

3.试给出二叉树的自下而上,从右到左的层次遍历算法。

#include<iostream>
using namespace std;
#define Max 10
typedef struct treenode{char data;struct treenode *lchild,*rchild;
}treenode,*tree;
void buildtree(tree &t)
{char ch;ch=getchar();if(ch=='#') t=NULL;else{t=(treenode *)malloc(sizeof(treenode));t->data=ch;t->lchild=NULL;t->rchild=NULL;buildtree(t->lchild);buildtree(t->rchild);}
}
typedef struct stack1{struct treenode *data[Max];int top;
}stack1;
bool isempty(stack1 s)
{if(s.top==-1) return true;return false;
}
bool isfull(stack1 s)
{if(s.top==Max-1)    return true;return false;
}
bool enters(stack1 &s,treenode *p)
{if(isfull(s)){cout<<"栈满"<<endl;return false;}s.data[++s.top]=p;return true;
}
bool outs(stack1 &s,treenode *&p)
{if(isempty(s)){cout<<"栈空"<<endl;return false;}p=s.data[s.top--];return true;
}
struct squeue1{struct treenode *data[Max];int f,r,tag;
};
bool entersqueue(squeue1 &s,treenode *x)
{if(s.f==s.r&&s.tag==1){cout<<"队满"<<endl;return false;}s.data[s.r]=x;s.r=(s.r+1)%Max;s.tag=1;return true;
}
int outsqueue(squeue1 &s,treenode *&x)
{if(s.f==s.r&&s.tag==0){cout<<"队空"<<endl;return 0;}x=s.data[s.f];s.f=(s.f+1)%Max;s.tag=0;return 1;
}
void solve(tree t)
{stack1 s;squeue1 q;treenode *p;if(t){s.top=-1;q.f=q.r=q.tag=0;entersqueue(q,t);while(!(q.f==q.r&&q.tag==0)){outsqueue(q,p);enters(s,p);if(p->lchild) entersqueue(q,p->lchild);if(p->rchild) entersqueue(q,p->rchild);}while(!isempty(s)){outs(s,p);cout<<p->data<<" ";}}
}
int main()
{tree t;buildtree(t);solve(t);return 0;
}
//测试数据:ABD##E##CF##G##

4.假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。

//非递归计算二叉树的高度
#include<iostream>
using namespace std;
typedef struct treenode{char data;struct treenode *lchild,*rchild;
}treenode,*tree;
void buildtree(tree &t)
{char ch;ch=getchar();if(ch=='#') t=NULL;else{t=(treenode *)malloc(sizeof(treenode));t->data=ch;t->lchild=NULL;t->rchild=NULL;buildtree(t->lchild);buildtree(t->rchild);}
}
int dept(tree t)
{if(!t) return 0;tree q[10];int f=-1,r=-1;int L=0,ans=0;q[++r]=t;tree p;while(f<r){p=q[++f];if(p->lchild) q[++r]=p->lchild;if(p->rchild) q[++r]=p->rchild;if(f==L){ans++;L=r;}}return ans;
}
int main()
{tree t;buildtree(t);cout<<"树的高度为:"<<dept(t)<<endl;return 0;
}
//测试数据:ABD##E##CF###

5.设一颗二叉树中各个节点的值互不相同,其先序遍历序列和中序遍历序列分别存于两个一维数组A[1...n]和B[1...n]中,试编写算法建立该二叉树的二叉链表。

//中序先序构造二叉树
#include<iostream>
using namespace std;
typedef struct treenode{char data;struct treenode *lchild,*rchild;
}treenode,*tree;
int pos=0;
tree build(char a[],char b[],int s,int e)
{if(s<=e){treenode *root=(treenode *)malloc(sizeof(treenode));root->data=a[pos];int i;for(i=s;i<=e;i++) if(b[i]==root->data) break;pos++;root->lchild=build(a,b,s,i-1);root->rchild=build(a,b,i+1,e);return root;}return NULL;
}
void disp(tree t)
{if(t){disp(t->lchild);disp(t->rchild);cout<<t->data<<" ";}
}
int main() {char a[]={'A','B','D','E','C','F'};//先序序列char b[]={'D','B','E','A','F','C'};//中序序列tree root=build(a,b,0,5);cout<<"后序序列为:"<<endl;disp(root);return 0;
}
/*        A/    \B      C/ \    /D   E  F
*/

6.二叉树按二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树的算法。

//判断是否是完全二叉树
#include<iostream>
using namespace std;
#define Max 15
typedef struct treenode{char data;struct treenode *lchild,*rchild;
}treenode,*tree;
void buildtree(tree &t)
{char ch;ch=getchar();if(ch=='#') t=NULL;else{t=(treenode *)malloc(sizeof(treenode));t->data=ch;t->lchild=NULL;t->rchild=NULL;buildtree(t->lchild);buildtree(t->rchild);}
}
struct squeue{struct treenode *data[Max];int f,r,tag;
};
bool isempty(squeue s)
{if(s.f==s.r&&s.tag==0) return true;return false;
}
bool isfull(squeue s)
{if(s.f==s.r&&s.tag==1) return true;return false;
}
bool enters(squeue &s,treenode *p)
{if(isfull(s)) return false;s.data[s.r]=p;s.r=(s.r+1)%Max;s.tag=1;return true;
}
bool outs(squeue &s,treenode *&p)
{if(s.f==s.r&&s.tag==0) return false;p=s.data[s.f];s.f=(s.f+1)%Max;s.tag=0;return true;
}
bool isok(tree t)
{squeue s;s.f=s.r=s.tag=0;bool flag=true,ans=true;if(t==NULL) ans=true;if(!t->lchild&&!t->rchild) ans=true;enters(s,t);treenode *p;while(!isempty(s)){outs(s,p);if(!p->lchild){flag=false;if(p->rchild) ans=false;}else//有左孩子{if(flag)//之前不存在缺孩子的节点{enters(s,p->lchild);if(p->rchild) enters(s,p->rchild);else flag=false;}else//之前存在缺孩子的节点ans=false;}}if(ans) return true;return false;
}
int main()
{tree t;buildtree(t);if(isok(t)) cout<<"yes"<<endl;else cout<<"no"<<endl;return 0;
}
//ABD##E##CF##G##  完全
//ABD###CE##F##  非完全

7.假设二叉树采用二叉链表存储结构存储,试着设计一个算法,计算一颗给定二叉树的所有双分支节点的个数。

//计算二叉树中双分支结点的个数
#include<iostream>
using namespace std;
typedef struct treenode{char data;struct treenode *lchild,*rchild;
}treenode,*tree;
void buildtree(tree &t)
{char ch;ch=getchar();if(ch=='#') t=NULL;else{t=(treenode *)malloc(sizeof(treenode));t->data=ch;t->lchild=NULL;t->rchild=NULL;buildtree(t->lchild);buildtree(t->rchild);}
}
int num(tree t)
{if(!t) return 0;else if(t->lchild&&t->rchild) return num(t->lchild)+num(t->rchild)+1;else return num(t->lchild)+num(t->rchild);
}
int main()
{tree t;buildtree(t);cout<<"该二叉树中双分结点有 "<<num(t)<<" 个"<<endl;return 0;
}
/*A/  \B    C/\     /  \D E    F   G*/
//前序序列:ABD##E##CF##G##

8.设树B是一颗采用链式结构存储的二叉树,编写一个把树B中所有节点的左,右子树进行交换的函数。

//交换左右子树
#include<iostream>
using namespace std;
typedef struct treenode{char data;struct treenode *lchild,*rchild;
}treenode,*tree;
void buildtree(tree &t)
{char ch;ch=getchar();if(ch=='#') t=NULL;else{t=(treenode *)malloc(sizeof(treenode));t->data=ch;t->lchild=NULL;t->rchild=NULL;buildtree(t->lchild);buildtree(t->rchild);}
}
void swap(tree &t)
{treenode *p;if(t){swap(t->lchild);swap(t->rchild);p=t->lchild;t->lchild=t->rchild;t->rchild=p;}
}
void disp(tree t)
{if(t){cout<<t->data<<" ";disp(t->lchild);disp(t->rchild);}
}
int main()
{tree t;buildtree(t);cout<<"交换过后的二叉树为(前序序列):"<<endl;swap(t);disp(t);return 0;
}
/*A                            AB    C                       C     BD  E  F  G                   G   F   E  D  ABD##E##CF##G##                   ACGFBED */

【王道数据结构编程题】- 二叉树算法题相关推荐

  1. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  2. 王道——数据结构——树与二叉树(3)

    系列文章目录 其他章节相关文章 王道--数据结构--栈和队列(1) 本章节其他相关文章 王道--数据结构--树与二叉树(1) 王道--数据结构--树与二叉树(2) 王道--数据结构--树与二叉树(4) ...

  3. java关于hashmap编程题_LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

  4. Java构造字符串算法题_LeetCode算法题-Repeated Substring Pattern(Java实现)

    这是悦乐书的第236次更新,第249篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第103题(顺位题号是459).给定非空字符串检查是否可以通过获取它的子字符串并将子字符 ...

  5. 数据结构树及相关算法题

    树 定义 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点: 有一个特 ...

  6. python比赛积分类算法题_Python算法题(一)——青蛙跳台阶

    题目一(青蛙跳台阶): 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析: 假设只有一级台阶,则总共只有一种跳法: 假设有两级台阶,则总共有两种跳法: ...

  7. python算法题_Python算法题

    #!/usr/bin/env python#-*- encoding: utf-8 -*- '''@File :getPositivenumberList.py @Description :输入一个正 ...

  8. 蓝桥杯web:第九题【算法题】小兔子爬楼梯

    小兔子想去月球上旅行,假设小兔子拥有一个 n 阶梯子,当你爬完 n 层就可以到达月球,小兔子每次可以跳 1 或者 2 个台阶,小兔子有多少种跳法可以到达月球呢? 给定 n 是一个正整数,代表梯子的阶数 ...

  9. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

最新文章

  1. 百万粉女极客突袭深圳手机公司:你们说想要源码就来自取?我来了
  2. Lock锁子类了解一下
  3. databricks使用
  4. FCN全连接卷积网络(3)--Fully Convolutional Networks for Semantic Segmentation阅读(摘要部分)
  5. Google首席科学家谈Google是怎么做深度学习的
  6. Java ObjectOutputStream writeInt()方法及示例
  7. 打开终端报错:bash: /某路径/bashrc: No such file or directory
  8. 如何设置 iCloud 云盘?
  9. 160809312 王仲超 第四次作业
  10. jsweet-examples下载测试
  11. 自定义百度网盘分享密码 提取码
  12. ACM------吃在工大(合工大OJ 1359)
  13. Java前方交会后方交会编程_单像空间后方交会和双像解析空间后方-前方交会的算法程序实现.doc...
  14. ELK集群状态yellow状态解决及解决思路
  15. 英特尔45nm生产良率已达90%
  16. STM32CubeIDE XiP 和 BootROM介绍, XiP外部内存QSPI FLASH执行用户代码
  17. 重卡自动驾驶进入“正规战”
  18. java fx 重绘_JavaFX 2.2:如何强制重绘/更新ListView
  19. maven 导入jar包失败编译代码失败解决方案
  20. 算法工程师0——算法工程师学习进阶路线

热门文章

  1. html 常见的电商产品的展示
  2. Linux的gedit没有权限,Ubuntu下有关gedit的各种问题
  3. 深度学习中的强化学习和对抗学习
  4. kali系统安装详细(跟着图片一步一步进发)
  5. Andorid适配器应用
  6. J1900安装ContOS7 U盘引导
  7. 美丽与魅力,只是因为我做到了
  8. Java#37(反射)
  9. BraTS19_summary
  10. 优质的海鲜cc0高清摄影图片素材推荐,不容错过