前几天回家过中秋,我一直在想二叉树的3种遍历方法,今天在图书馆自习的时候想出来了,现在我跟大家先分享一下二叉树的3种遍历的递归算法,递归算法很简单,关键在于理解二叉树遍历的核心思想,话不多说,我们直接看代码:
#include<iostream>
#include<queue>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}//初始化列表
};
/*二叉树的前序遍历
根左右
*/
void PreOrder(TreeNode* t) {
if(t==NULL)
return;
cout<<t->val<<" ";
PreOrder(t->left);
PreOrder(t->right);
}
/*二叉树的中序遍历
左根右
*/
void InOrder(TreeNode* t){
if(t==NULL)
return;
InOrder(t->left);
cout<<t->val<<" ";
InOrder(t->right);
}
/*二叉树的后序遍历
左右根
*/
void LastOrder(TreeNode* t){
if(t==NULL)
return;
LastOrder(t->left);
LastOrder(t->right);
cout<<t->val<<" ";
}
//初始化一棵二叉树
TreeNode* InitBTree(int a[],int size){
if(size<1){
return NULL;
}
//动态申请size大小的指针数组
TreeNode **nodes=new TreeNode*[size];
//将int数组转换为TreeNode结点
for(int i=0;i<size;i++){
if(a[i]==0){
nodes[i]=NULL;
}
else{
nodes[i]=new TreeNode(a[i]);
}
}
queue<TreeNode*> nodeQueue;
nodeQueue.push(nodes[0]);
TreeNode *node;
int index = 1;
while (index < size)
{
node = nodeQueue.front();
nodeQueue.pop();
nodeQueue.push(nodes[index++]);
node->left = nodeQueue.back();
nodeQueue.push(nodes[index++]);
node->right = nodeQueue.back();
}
return nodes[0];
}
int main(){
int nums[]={1,2,3,4,0,5,6,0,7};
TreeNode *root=InitBTree(nums,9);
PreOrder(root);
cout<<endl;
InOrder(root);
cout<<endl;
LastOrder(root);
return 0;
}
我先说一下nums这个数组,它里面的元素是根据完全二叉树构造的,0代表这个结点为null。其实难点还是在于二叉树的初始化,我是用队列来完成的,主要算法是:先将根结点入队,然后将它的左孩子和右孩子依次入队。然后根结点出队,队首变成了根结点的左孩子(如果存在),然后反复递归,最终把nums数组里面的元素变成了一棵二叉树。
上面是我写的二叉树遍历基于递归的算法,非递归算法的话,我想过几天再写,你们如果对我写的代码有什么改进意见的话,可以私聊我博客,我们共同进步,我几乎天天都会去看博客。