ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

关于二叉树遍历的反思(C++)

2021-11-29 02:31:07  阅读:111  来源: 互联网

标签:head 遍历 C++ right 二叉树 push stack left


目录
全文基于左程云老师的教学,感谢左程云老师!

二叉树函数

struct treenode {
     node* left;
     node* right;
     int val;
     node(int x){val=x;}
}*Node;

递归序

递归序是指在递归过程中实际访问的节点顺序

例如树{1,2,3,4,5,6,7}

根据递归行为可知其递归序为:1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1

递归遍历

先序遍历(头左右):打印第一次出现的节点:1,2,4,5,3,6,7

void preorder(Node head) {
     if(head==NULL)return;
     
     cout << head->val;
     preorder(head->left);
     preorder(head->right);
}

中序遍历(左头右):打印第二次出现的节点:4,2,5,1,6,3,7

void inorder(Node head) {
     if(head==NULL)return;
    
     inorder(head->left);
     cout << head->val;
     inorder(head->right);
}

后序遍历(右头左):打印第三次出现的节点:4,5,2,6,7,3,1

void postorder(Node head) {
     if(head==NULL)return;
     
     postorder(head->left);
     postorder(head->right);
     cout << head->val;
}

非递归遍历

先序遍历(头左右):1,2,4,5,3,6,7

先放右再放左,因为栈先进后出

void preorder(Node head) {
     if(head!=NULL) {
        stack<Node>stack;
        stack.push(head);
        while(!stack.empty()) {
          head = stack.top();
          stack.pop();
          cout << head->val << " ";
          if(head->right) {
            stack.push(head->right);
          }
          if(head->left) {
            stack.push(head->left);
          }
       }
     }
}

后序遍历(右头左):4,5,2,6,7,3,1

准备一个辅助栈进行打印(可以直接用队列)

void postorder(Node head) {
     if(head!=NULL) {
        stack<Node>stack1;
        stack<Node>stack2;
        stack1.push(head);
        while(!stack1.empty()) {
          head = stack1.top();
          stack1.pop();
          stack2.pop();
          cout << head->val << " ";
          if(head->left) {
            stack1.push(head->left);
          }
          if(head->right) {
            stack1.push(head->right);
          }
       }
       while(!s2.empty()) {
       	cout << s2.top() << " ";
       	s2.pop();
	   }
     }
}

中序遍历(左头右):4,2,5,1,6,3,7

整棵树左边界进栈,依次弹出节点的过程中,打印,对弹出节点的右树重复

 void postorder(Node head) {
     if(head!=NULL) {
     	stack<Node>stack;
     	while(!stack.empty() || head!=NULL) {
     		if(head!=NULL) {
     			stack.push(head);
     			head=head->left;
			 } else {
			 	head=stack.top();
			 	stack.pop();
			 	cout << head->val << " ";
			 	head=head->right;
			 }
		 }
	 }
}

层序遍历(一层一层):1,2,3,4,5,6,7

递归要压两次栈,比较复杂。

所以采取BFS(宽度优先遍历)进行遍历

void floororder(Node head)
{
    queue<Node>q;
    if (head != NULL)
    {
        q.push(head); 
    }

    while (!q.empty())
    {
        cout << q.front()->val << " "; 
        if (q.front()->left)   
        {
            q.push(q.front()->left);   
        }

        if (q.front()->right)   
        {
            q.push(q.front()->right);
        }
        q.pop();
    }
}

标签:head,遍历,C++,right,二叉树,push,stack,left
来源: https://www.cnblogs.com/Starchaser/p/15617403.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有