二叉树的基本操作

来源:互联网 发布:python math.ceil 编辑:程序博客网 时间:2024/05/17 07:31

本文就二叉树的基本操作进行总结

包括二叉树的建立、递归遍历、非递归遍历、层序遍历等

二叉树的结构体如下

typedef struct _node{char data;struct _node* lchild;struct _node* rchild;}node;

1.二叉树的建立

void create(node*& tree){char data;scanf("%c",&data);if ('#'==data){tree=NULL;return;}tree=(node*)malloc(sizeof(node));tree->data=data;printf("输入%c的左节点:",data);create(tree->lchild);printf("输入%c的右节点:",data);create(tree->rchild);}

2.递归遍历

void preOrder(node* tree)  //先序递归遍历{if(tree){printf("%c",tree->data);preOrder(tree->lchild);preOrder(tree->rchild);}}void inOrder(node* tree)  //中序递归遍历{if(tree){inOrder(tree->lchild);printf("%c",tree->data);inOrder(tree->rchild);}}void postOrder(node* tree) //后序递归遍历{if(tree){postOrder(tree->lchild);postOrder(tree->rchild);printf("%c",tree->data);}}

3.非递归遍历

非递归遍历利用队列实现

void preOrder1(node* tree)   //先序非递归遍历{deque<node*> q;node* t=tree;while (t!=NULL||!q.empty()) {while (t!=NULL) {printf("%c",t->data);q.push_back(t);t=t->lchild;}t=q.back();q.pop_back();t=t->rchild;}}void inOrder1(node* tree)  //中序非递归遍历{deque<node*> q;node* t=tree;while (t!=NULL||!q.empty()) {while (t!=NULL) {q.push_back(t);t=t->lchild;}t=q.back();q.pop_back();printf("%c",t->data);t=t->rchild;}}void postOrder1(node* tree)  //后序非递归遍历{deque<node*> q;node* t=tree;node* prerchild=NULL;while (t!=NULL||!q.empty()) {while (t!=NULL) {q.push_back(t);t=t->lchild;}t=q.back();if (t->rchild==NULL||t->rchild==prerchild) {q.pop_back();printf("%c",t->data);prerchild=t;t=NULL;}else{t=t->rchild;}}}

4.层序遍历

层序遍历也是借助队列实现的

void levelOrder(node* tree){deque <node*> q;if (!tree) return;node* t=tree;q.push_back(t);while (!q.empty()) {t=q.front();q.pop_front();printf("%c",t->data);if (t->lchild) q.push_back(t->lchild);if (t->rchild) q.push_back(t->rchild);}}

层序遍历有时候,还需要将不同层之间分层输出,实现如下

void levelOrder1(node* tree){deque<node*> q;if (NULL==tree) return; node* t=tree;q.push_back(t);int levelNum=1;while(!q.empty()){levelNum=q.size();for (int i=0;i<levelNum;i++) {t=q.front();q.pop_front();printf("%c",t->data);if (t->lchild!=NULL) {q.push_back(t->lchild);}if (t->rchild!=NULL) {q.push_back(t->rchild);}}printf("\n");}}


原创粉丝点击