构建二叉树(据前序遍历结果)--- 前序遍历二叉树(递归与非递归)
2014-03-07 17:17
387 查看
#include <stdio.h> #include <stdlib.h> #define A 16 //二叉树前序遍历序列 int buffer[16]={10,6,4,-1,-1,8,-1,-1,14,12,-1,-1,16,-1,-1,-100}; //二叉树结构体 typedef struct binary_tree_node { int data; struct binary_tree_node* ltree; struct binary_tree_node* rtree; }Btnode; //创建新节点 Btnode* create_node(void) { Btnode* node; node=(Btnode*)malloc(sizeof(Btnode)); return node; } //据前序序列创建二叉树 /* 明确问题: (1)何时进行二叉树分支的切换 ①左分支遍历到叶子节点时 ②右分支有新的节点加入时 (2)何时节点入栈 新加入的非空节点 (3)何时节点出栈 某分支遍历到叶子节点时 */ Btnode* create_tree(int* buf) { Btnode* root; Btnode* pnode,*temp; Btnode* s[A]; bool ltree=true; int index=0; int m=0; root=create_node(); root->data=buf[index++]; s[m++]=root; pnode=root; while(buf[index]!=-100) { if(ltree==true) { if(buf[index]==-1) { pnode->ltree=NULL; index++; ltree=false; pnode=s[--m]; } else { temp=create_node(); temp->data=buf[index++]; pnode->ltree=temp; s[m++]=temp; pnode=temp; } } else { if(buf[index]==-1) { pnode->rtree=NULL; index++; pnode=s[--m]; } else { temp=create_node(); temp->data=buf[index++]; pnode->rtree=temp; s[m++]=temp; pnode=temp; ltree=true; } } } return root; } //递归方法前序遍历 void preorder_traversal(Btnode* pnode) { if(pnode!=NULL) { printf("%d ",pnode->data); } else { return; } preorder_traversal(pnode->ltree); preorder_traversal(pnode->rtree); return; } //非递归法前序遍历 void preorder_traversal1(Btnode* root) { Btnode* s[A]; Btnode* pnode; int m=0; bool ltree=true; pnode=root; s[m++]=pnode; printf("%d ",pnode->data); while(pnode!=NULL) { if(ltree==true) { if(pnode->ltree!=NULL) { pnode=pnode->ltree; s[m++]=pnode; printf("%d ",pnode->data); } else { ltree=false; pnode=s[--m]; } } else { if(pnode->rtree!=NULL) { pnode=pnode->rtree; s[m++]=pnode; printf("%d ",pnode->data); ltree=true; } else { pnode=s[--m]; } } if(m==-1) { break; } } } int main(void) { Btnode* root; root=create_tree(buffer); printf("Recursive preorder traversal result is:\n"); preorder_traversal(root); printf("\n\n"); printf("Non-Recursive preorder traversal result is:\n"); preorder_traversal1(root); printf("\n\n"); system("pause"); return 0; }
相关文章推荐
- 二叉树(利用栈和队列实现递归和非递归遍历,构建等)
- 递归和非递归俩种方法实现二叉树的前序遍历
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 已知前序遍历和中序遍历结果构造二叉树(非递归解法)
- 递归和非递归俩种方法实现二叉树的前序遍历
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 构建二叉树(据后序遍历序列)---后续遍历二叉树(递归与非递归)
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字
- 请用递归和非递归俩种方法实现二叉树的前序遍历。
- 二叉树的建立(根据遍历结果构建)、遍历(非递归)和搜索
- 请用递归和非递归俩种方法实现二叉树的前序遍历。
- 43.递归和非递归俩种方法实现二叉树的前序遍历。
- 重建二叉树(根据前序和中序遍历结果)
- 二叉树的存储方式以及递归和非递归的三种遍历方式
- 二叉树创建及遍历算法(递归及非递归)
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- 二叉树的三种遍历方式(递归与非递归详细实现)
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归) 层次遍历
- 二叉树的遍历算法(递归与非递归)