二叉树实例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struct BSTreeNode{ int m_nValue; BSTreeNode *m_pLeft; BSTreeNode *m_pRightnode };
ቤተ መጻሕፍቲ ባይዱ
if(root->rightch)
Revertsetree(root->rightch); }
19:43:52
3
前序遍历的非递归算法 void preorder(BiTree * T){ InitStack(s);
void ancestor(BiTree T, int x){ int top=0,i; while(1){ struct node{ while(T){ //将T所指所有左结点入栈 BiTree p; top++; int tag; s[top].p=T; }s[100]; s[top].tag=0; T=T->lchild; } if(top==0) return; if(s[top].tag==0 && s[top].p->rchild) { //从左子树返回,进入右子树 s[top].tag=1; t=s[top].p->rchild; }else{ if(s[top].p->data==x){ for(i=1;i<top;i++)printf("%d", s[i].p->data); return; } top--; } } }
p=T;
while(p||!StackEmpty(s)){ if(p){
printf("%c",p->data);
if(p->rchild) push(s, p->rchild); p=p->lchild;
}else pop(S,p);
} }
19:43:52 4
在二叉树中查找值 为x的结点,试设计打印值为x的结点的所有祖先的算法,假设值为x的结点不多于一个。
寻找两个节点的最近邻的共同祖先
Node * NearestCommonAncestor(Node * root,Node * p,Node * q){ Node * temp; while(p!=NULL){ p=p->parent; class Node{ Node * left; Node * right; Node * parent; };
19:43:52 5
以二叉链表为存储结构,分别写出求二叉树宽度的算法,所谓宽度 是指二叉树的各层上,具有结点数最多的那一层上的结点总数。
要求二叉树的宽度的话,则可根据树的高度设置一个数组temp。 temp[i]用于存放第i层上的结点数(即宽度)。在访问结点时,把相应 计算该结点下一层的孩子数并存入相应数组元素中,遍历左子树后 向上返回一层计算右子树的宽度,并取出最大的一个数组元素作为 树的宽度。
}
19:43:52 2
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的 二元查找树中,左子树的结点都大于右子树的结点。用递归方法完成 树的镜像转换。 void Revertsetree(list *root){
if(!root)return;
list *p; p=root->leftch; root->leftch=root->rightch; root->rightch=p; if(root->leftch) Revertsetree(root->leftch);
19:43:52
6
#define M 10 //假设二叉树最多的层数 int Width(BinTree T){ int static n[M];//向量存放各层结点数 int static i=1; int static max=0;//最大宽度 if(T){ if(i==1) { //若是访问根结点 } return max; }//算法结束
19:43:52
7
BiTree p;
if(T==NULL) return ; InitQueue(Q);
EnQueue(Q,T);
while(!QueueEmpty(Q)){ DeQueue(Q,p); printf(p->data); if(p->lchild)EnQueue(Q,p->lchild); if(p->rchild)EnQuene(Q,p->rchild); }
temp=q;
while(temp!=NULL){ if(p==temp->parent)return p; temp=temp->parent; } } }
19:43:52
1
给定一棵二叉树,其根指针为 T ,试写出从根开始, 按层次遍历二叉树,同层结点从左向右遍历。
void levelorder(BiTree T){ Queue Q[maxsize];
n[i]++; //第1层加1 i++; //到第2层 if(T->lchild) n[i]++; //若有左孩子则该层加1 if(T->rchild) n[i]++; //若有右孩子则该层加1 } else { //访问子树结点 i++; //下一层结点数 if(T->lchild) n[i]++; if(T->rchild) n[i]++; } if(max<n[i])max=n[i];//取出最大值 Width(T->lchild);//遍历左子树 i--; //往上退一层 Width(T->rchild);//遍历右子树
相关文档
最新文档