C++根据层序遍历序列构造二叉树,再层序遍历二叉树

层序构造&层序遍历

要用到一个协助队列

层序构造
假设要构造的二叉树的层序遍历序列存在一个数组里
1.只要数组不为空,就先入队数组首元素,并用这个值创建二叉树的root。
2.然后进入循环,队列不为空,就拿队头元素,对头再出队。队列为空,结束循环。
3.只要数组还有元素,就先给刚刚拿出的对头元素创建左孩子,然后左孩子入队。
4.同上,再创建右孩子,右孩子入队。
5.结束一次循环。回到2

层序遍历
与层序构造类似
1.树不为空,root先入队
2.进入循环,队列不为空,则拿到队头元素,对头出队。队列为空,结束循环。
3.打印刚刚对头元素的数据。
4.它如果存在左孩子,左孩子入队。
5.它如果存在右孩子,右孩子入队。
6.结束一次循环,回到2

#include 
#include
#include
using namespace std;

typedef int type;
typedef struct treeNode {
 type data;
 treeNode* left;
 treeNode* right;
}treeNode;

//按照层序遍历构造二叉树
//假设层序序列已经存进vector中,并且是一颗完全二叉树
treeNode* creatBinTree(vector<int> arr) { 
 queue<treeNode*> q;
 
 //如果层序序列为空,返回空树
 if (arr.empty()) {
  return nullptr;
 }
 
 treeNode* head = new treeNode; //创建头节点
 head->data = arr[0];  //存放数组首元素
 q.push(head); //入队
 
 treeNode* bt;
 int i = 1;
 while (!q.empty()) {
  bt = q.front();  //取出头节点,准备给它安排左右孩子
  q.pop(); //头节点出队,每一次新的循环,都让头出队
  
  //先弄左孩子
  //i只要不超过数组的有效长度,就有左孩子
  if (i < arr.size()) {
   bt->left = new treeNode;
   bt->left->data = arr[i];
   q.push(bt->left);  //左孩子入队
   i++; //数组后移
  }
  else {
   bt->left = nullptr;
  }
  
  //再弄右孩子
  if (i < arr.size()) {
   bt->right = new treeNode;
   bt->right->data = arr[i];
   q.push(bt->right);  //右孩子入队
   i++;  //数组后移
  }
  else {
   bt->right = nullptr;
  }
 }
 return head;  //最后队列为空就出while,返回头节点
}

//层序遍历二叉树
void printBinTree(treeNode* head) {
 queue<treeNode*> q;
 treeNode* b;
 
 //树为空
 if (head == nullptr) {
  cout << "treeNode is empty!" <<endl;
  return;
 }
 
 //头节点入队
 q.push(head);
 
 while (!q.empty()) {
 
  b = q.front();  //拿到队头,队头出队
  q.pop();
  cout << b->data << endl;  //打印对头的数据
  
  //对头的左孩子存在就入队
  if (b->left) {
   q.push(b->left);
  }
  
  //对头的右孩子存在就入队
  if (b->right) {
   q.push(b->right);
  }
 }
}

int main() {
 vector<int> a;
 for (int i = 0; i < 9; i++) {
  a.push_back(i);
 }
 for (auto& p : a) {
  cout << p;
 }
 cout << endl;
 treeNode* head = creatBinTree(a);
 printBinTree(head);
}

你可能感兴趣的:(C++,数据结构)