设一棵二叉树的结点定义为 struct BinTreeNode{ ElemType data;BinTreeNode*leftchild,*rightc
1、求如下(见附件图1)二叉树的先序、中序、后序、层序遍历序列。(20分) 2、已知一棵二叉树的先序和中序遍历的结点序列分别为IJKLMNO及JLKINMO,试画出此二叉树,并给出后序遍历序列结果。(40分) 3、设二叉树以二叉链表为存储结构,结点类型定义如下: typedef struct Node{ int data; struct Node *lchild, *rchild }BiTNode, *BiTree; 请编写一个函数 int Count (BTree T),其功能是计算T所指的二叉树中结点值为偶数的结点数并返回该值。 (40分)
设二叉树以二叉链表方式存储,试完成下列问题的递归算法。 设二叉树结点和二叉树结构体定义如下: typedef struct btnode { ElemType element; struct btnode* lchild, *rchild; }BTNode; typedef struct binarytree{ BTNode* root; }BinaryTree; (1)求一棵二叉树的高度; int Depth(BTNode *p) { int lh, rh; if (!p) return 0; lh = ______________; rh = _____________; if (lh > rh) return _________; else return ________; } int DepthofBT(BinaryTree Bt) { return ___________; } (2)求一棵二叉树中的结点个数; int Size(BTNode * p) { if (!p) return _____ ; else return Size(p->lchild)+______________+1; } int SizeofBT(BinaryTree Bt) { return ______________); } (3)交换一棵二叉树中每个结点的左、右子树。 void exchange (BTNode * p) { if(!p) return; if (p->lchild != NULL || p->rchild != NULL ) { temp = p->lchild; p->lchild = ____________; p->rchild = temp; exchange (___________ ); exchange (p->rchild ); } } void exchange(BinaryTree *bt) { ____________________; }
二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中的结点指针的指向。比如输入图4.12中左边的二叉搜索树,则输出转换之后的排序双向链表。
二叉树结点的定义如下:
struct BinaryTreeNode
{
int m_ nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
程序填空。 若已知一棵二叉树的先序和中序,可唯一确定这棵树。以下按照该法创建一棵二叉树,接着按中序遍历。 #include <stdio.h> #include <stdlib.h> typedef char ElemType; //定义结点数据为int型 typedef int Status; //定义函数类型为int型 #define ERROR 0 #define OK 1 struct BiTNode{ //定义结构体 ElemType data; //结点数值 struct BiTNode *lchild; //左孩子指针 struct BiTNode *rchild; //右孩子指针 }; BiTNode *BiTree,*s; // 两个全局指针变量 ElemType x[4]={'A','B','C','D'}; //该树的先序序列 ElemType z[4]={'C','B','A','D'}; //该树的中序序列 void CreateBiTree(BiTNode *root,ElemType y) //功能:将y插入到root所指向的树 { int k=0; if(root==NULL) //若root为空,即root指向空树,(*s)成为该树的根节点 {root=s;s->data=y;s->lchild=NULL;s->rchild=NULL;} //填充(*s) else //若非空 { while(_________________) //5分 k++; //在中序列找到等于当前插入元素y或者等于当 // 前根元素(root->data)的结点为止 if(z[k]==y) //若找到的结点等于当前插入元素y,说明y在根元 { //素(root->data)左边,代表y在根元素的左子树 CreateBiTree(root->lchild,y); //将y插入当前root的左子树 __________=BiTree; //配合BiTree=root; 使全局变量BiTree逐渐回归 } //到最大树的根节点,以便插入下一个结点时始终从最大树根节点出发 //同时使结点(*s)获得父亲 3分 else // 若找到的结点等于当前根元素(root->data),说明 { //y在当前根元素的右边,代表y在当前根元素的右子树 CreateBiTree(root->rchild,y); //将y插入当前root的右子树 ___________=BiTree; //配合BiTree=root; 使全局..........(同上) } } BiTree=root; //和上面配合,使全局变量BiTree逐渐回归到最大树的根节点。 //目前,BiTree、root、s三者相同,但结点(*s)还没有父亲 } void MidOrder(BiTNode *root) //中序遍历方法 { if(!(root->lchild==NULL)) MidOrder(root->lchild); printf("%c",root->data); if(!(root->rchild==NULL)) MidOrder(root->rchild); } main() { int i; BiTree=NULL; for(i=0;i<4;i++) if(s="(BiTNode*)malloc(sizeof(BiTNode)))" { createbitree(bitree,x[i]); 按照先序序列逐个插入,所有结点插入完毕后 树就建成了 } midorder(bitree);>
为了保护您的账号安全,请在“简答题”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!