二叉树遍历方式总结

来源:互联网 发布:sem和seo区别 编辑:程序博客网 时间:2024/06/16 03:06

经过几次面试发现,二叉树经常在面试中被问到,而二叉树的遍历方式又是经常被考到的,所以对二叉树的遍历方式进行一下总结:


首先说一下几种常见的遍历方式,即经常使用的也是非常容易写的递归的遍历方式:

前序遍历的递归写法:

void preorder(TreeNode *root){       if(root!=NULL)       {              printf("%d\n",root->value);              preorder(root->left);              preorder(root->right);       }}

中序遍历的递归写法:

void inorder(TreeNode *root){       if(root!=NULL)       {               inorder(root->left);               printf("%d\n",root->value);               inorder(root->right);         }}

后续遍历的递归写法:

void postorder(TreeNode *root){       if(root!=NULL)       {              postorder(root->left);              postorder(root->right);              printf("%d\n",root->value);       }}

下面是三种遍历方式的非递归方式:


前序遍历的非递归写法:

void preorder(TreeNode *root){      stack<TreeNode *> s;      TreeNode *p=root;      while(p!=NULL || !s.empty())     {            while(p)            {                    push(p);                   printf("%d\n",p->value);                   p=p->left;            }            s.pop();            p=s.top();}

中序遍历的非递归写法:

void inorder(TreeNode *root){        stack<TreeNode *> s;        TreeNode *p=root;        while(p!=NULL||!s.empty())       {               while(p)              {                    push(p);                    p=p->left;               }              p=s.top();              printf("%d\n",p->value);              s.pop();              p=p->right;        }}

后序遍历的非递归写法(此段代码为引用):

void postorderTraversal(TreeNode *root, vector<int> &path){    stack<TempNode *> s;    TreeNode *p = root;    TempNode *temp;    while(p != NULL || !s.empty())    {        while(p != NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点        {            TreeNode *tempNode = new TreeNode;            tempNode->btnode = p;            tempNode->isFirst = true;            s.push(tempNode);            p = p->left;        }        if(!s.empty())        {            temp = s.top();            s.pop();            if(temp->isFirst == true)   //表示是第一次出现在栈顶            {                temp->isFirst = false;                s.push(temp);                p = temp->btnode->right;            }            else  //第二次出现在栈顶            {                path.push_back(temp->btnode->val);                p = NULL;            }        }    }}
还有一种经常考的是层次遍历:

void layerorder(TreeNode*root){       queue <TreeNode*>q;       TreeNode *p=root;       q.enqueue(p);       while(q!=NULL)       {              p=q.delqueue();              if(p->left!=NULL)              q.enqueue(p->left);               if(p->left!=NULL)              q.enqueue(p->left);        }}











0 0