intCreateBiTree(BiTree&t)// 结构体指针要修改必须用 & 表示是引用类型{/** 创建二叉树 链式存储法 中序依次输入结点 包括空节点 **/int ch;scanf("%d",&ch);if(ch ==999){ t =NULL;return-1;}else{ t =(BiTree)malloc(sizeof(TNode)); t->data = ch;CreateBiTree(t->lchild);CreateBiTree(t->rchild);}return0;}voidinsertBiNode(BiTree&T,int number){/** 插入单个结点 从左至右,从上至下 **/if(T==NULL){//空树 T =(BiTree)malloc(sizeof(TNode)); T->data = number; T->lchild =NULL; T->rchild =NULL;}Queen q =init_queen();bool flag =false;TNode* p = T;TNode* temp;in_queen(q, p);while(q->front!=q->rear && flag==false){ p =out_queen(q); temp =(TNode*)(malloc(sizeof(TNode))); temp -> data = number; temp->lchild =NULL; temp ->rchild =NULL;if(p->lchild==NULL){ p->lchild = temp; flag =true;}elseif(p->rchild==NULL){ p->rchild = temp; flag =true;}else{in_queen(q, p->lchild);in_queen(q, p->rchild);}}}
先序遍历
intpre_bianli(BiTree T){// 先序遍历int height =0;// 求树的深度Stackstack=init_Stack();// 初始化空栈TNode* pre ,*p; p = T;// 遍历指针 pre =NULL;//上一个访问的结点while(stack->top!=-1|| p!=NULL){// 栈不空或者遍历指针不空if(p!=NULL){ std::cout<<p->data<<",";// 先访问后入栈 pre = p;//记录最近访问结点push_stack(stack, p); p = p->lchild;}else{if(stack->top+1> height){ height =stack->top+1;} p =pop_stack(stack);//出栈if(p->rchild!=NULL&& p->rchild!=pre){ p = p ->rchild;}else{ p =NULL;}}}return height;}
中序遍历
intmid_bianli(BiTree T){//中序遍历int height =0;// 求树的深度Stackstack=init_Stack();// 初始化空栈TNode* pre ,*p; p = T;// 遍历指针 pre =NULL;//上一个访问的结点while(stack->top!=-1|| p!=NULL){// 栈不空或者遍历指针不空if(p!=NULL){push_stack(stack, p); p = p->lchild;}else{if(stack->top+1> height){ height =stack->top+1;} p =pop_stack(stack);//出栈 std::cout<<p->data<<",";// 访问if(p->rchild!=NULL){ p = p ->rchild;}else{ p =NULL;}}}return height;}
后序遍历
intpost_bianli(BiTree T){//后序遍历int height =0;// 求树的深度Stackstack=init_Stack();// 初始化空栈TNode* pre ,*p; p = T;// 遍历指针 pre =NULL;//上一个访问的结点while(stack->top!=-1|| p!=NULL){// 栈不空或者遍历指针不空if(p!=NULL){push_stack(stack, p); p = p->lchild;}else{if(stack->top+1> height){ height =stack->top+1;} p =stack->nodes[stack->top];// 取栈顶元素if(p->rchild!=NULL&& p->rchild!=pre){ p = p ->rchild;}else{ p =pop_stack(stack);//出栈 std::cout<<p->data<<",";// 出栈访问 pre = p;//记录最近访问结点 p =NULL;}}}return height;}
层次遍历
voidcengci_bianli(BiTree T){// 层次遍历int weight =0;int height =0;Queen q =init_queen();// 初始化对列TNode* p = T;in_queen(q, p);TNode* last = p;// 记录每层的最后一个结点 当这个节点出队时更新while(q->front!=q->rear || p!=NULL){// 队列不空或者遍历指针不空 p =out_queen(q); std::cout<<p->data<<",";if(p->lchild!=NULL){in_queen(q, p->lchild);}if(p->rchild!=NULL){in_queen(q, p->rchild);}if(p == last){// 高度更新 height ++;if((q->rear-q->front+q->size)%q->size > weight){// 宽度更新 weight =(q->rear-q->front+q->size)%q->size;} last = q->nodes[(q->rear)%q->size];// 队尾元素是下一层的最后一个节点} p =NULL;} std::cout<<"树的高度为:"<<height<<"\n"; std