二叉树层遍历

来源:互联网 发布:淘宝上哪家卖红酒靠谱 编辑:程序博客网 时间:2024/05/22 15:53

二叉树的层遍历又可以成为广度优先遍历,广度优先通常都可以利用队列来解决:首先把根节点加入队列,然后判断队列是否为空,若非空就把队头元素作为当前节点,然后依次判断当前节点的左右子节点是否为空,若非空则加入队列;循环上述过程,直到队列为空。代码如下:

#include "stdafx.h"#include<iostream>#include <queue>#include <vector>using namespace std;typedef struct binary_tree_node{struct binary_tree_node* left;struct binary_tree_node* right;int data;}Binary_Tree_Node;void visit(Binary_Tree_Node* pNode){if (pNode!=NULL){cout<<pNode->data<<" ";}}Binary_Tree_Node* create_tree(vector<int> dataVec);void insert_node(Binary_Tree_Node* root,int data);void level_order(Binary_Tree_Node* root);void free_node(Binary_Tree_Node* root);int _tmain(int argc, _TCHAR* argv[]){int tmpArray[]={1,2,3,4,5,6,7,};vector<int> input(tmpArray,tmpArray+7);Binary_Tree_Node *root=create_tree(input);level_order(root);free_node(root);return 0;}Binary_Tree_Node* create_tree(vector<int> dataVec){if (dataVec.size()==0){return nullptr;}Binary_Tree_Node *root=new Binary_Tree_Node();root->left=NULL;root->right=NULL;root->data=dataVec[0];for (int i=1;i<dataVec.size();++i){insert_node(root,dataVec[i]);}return root;}void insert_node(Binary_Tree_Node* root,int data){if (root->left==NULL){Binary_Tree_Node* leftChild=new Binary_Tree_Node();leftChild->left=NULL;leftChild->right=NULL;leftChild->data=data;root->left=leftChild;return;}if (root->right==NULL){Binary_Tree_Node* leftChild=new Binary_Tree_Node();leftChild->left=NULL;leftChild->right=NULL;leftChild->data=data;root->right=leftChild;return;}insert_node(root->left,data);}void level_order(Binary_Tree_Node* root){if (root==NULL){return;}queue<Binary_Tree_Node*> pQueue;pQueue.push(root);while(!pQueue.empty()){Binary_Tree_Node *curNode=pQueue.front();pQueue.pop();visit(curNode);if (curNode->left!=NULL){pQueue.push(curNode->left);}if (curNode->right!=NULL){pQueue.push(curNode->right);}}}void free_node(Binary_Tree_Node* root){if (root->left!=NULL){free_node(root->left);}if (root->right!=NULL){free_node(root->right);}delete root;root=NULL;}
上述程序生成的二叉树如下图:

层遍历程序结果如下:



0 0
原创粉丝点击