竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生
给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),‘#’ 表示每层的末尾。
思路讲解与上题来看 本题的不同之处在于 这里不是完全二叉树了,但是不是二叉树依然没有关系 其中每一次遍历依然是 一层,我们要改动的地方就是遍历的地方 因为不一定每一层的第一个结点的左孩子都存在 这里使用一个队列来保存每一层的第一个元素即可
#include<bits/stdc++.h>
#define ElemType int
using namespace std;
typedef struct BiNTree{
struct BiNTree* Lchild;
ElemType data;
struct BiNTree* Rchild;
struct BiNTree* Next;
}BiNTree;
/*层序的思想是,首先需要判断此时第一个元素是否为空 为此
若是为空就不用需要进入树队中了 若是第一个元素不为空 则进入队列中
然后为其分配左右子树,若是值为-1 则表示此时的孩子为空 不需要入队
若是值不为-1 ,让其作为此时结点的孩子,然后此孩子入队
直到元素值队列为空*/
void Creat(BiNTree* &T){
int val;
BiNTree* cur;//定义一个cur
queue<ElemType> Q;
queue<BiNTree*> TreeQue;
cout<<"请输入层序遍历的序列"<<endl;
while(scanf("%d",&val)!=EOF) Q.push(val);
if(Q.front()==-1){
cout<<"树为空"<<endl;
T=NULL;
return ;
}
else{
T=(BiNTree*)malloc(sizeof(BiNTree));
T->data=Q.front();
TreeQue.push(T);
}
Q.pop();
while(!Q.empty()){//我们每一次处理 处理的都是左右孩子,所以也就需要两个if
cur=TreeQue.front();//取出此时树队中的第一元素
if(Q.front()==-1){//此时这个结点值为NULL
cout<<cur->data<<"左孩子为空"<<endl;
cur->Lchild=NULL;
}
else{//新生成一个树结点用来存放此时的结点信息
cout<<cur->data<<"左孩子为"<<Q.front()<<endl;
cur->Lchild=(BiNTree*)malloc(sizeof(BiNTree)) ;
cur->Lchild->data=Q.front();
TreeQue.push(cur->Lchild);
}
Q.pop();//处理完数据之后需要弹出 来取此结点右子树的值
//上面的if else 是处理结点左孩子 下面我们来处理右孩子
if(Q.front()==-1){
cout<<cur->data<<"右孩子为空"<<endl;;
cur->Rchild=NULL;
}
else{
cout<<cur->data<<"右孩子为"<<Q.front()<<endl;
cur->Rchild=(BiNTree*)malloc(sizeof(BiNTree));
cur->Rchild->data=Q.front();
TreeQue.push(cur->Rchild);
}
Q.pop();
TreeQue.pop();
}
}
void LevelOrder(BiNTree* T){//这里我们是使用的是队列来完成这个操作
queue<BiNTree*> Q,S; BiNTree* cur;
if(T==NULL){//跟前面一样 若是为空则不需要进队 直接返回即可
return ;
}
Q.push(T);
while(!Q.empty()){
int max=Q.front()->data;//别忘了使用这一行的第一个值来进行初始化
int size=Q.size();//需要一个值来保存 因为Q.size 是一直变得
for(int i=0;i<size;i++){
cur=Q.front();Q.pop();
if(i==0){S.push(cur);}//第一个元素放入队列中 方便等一下遍历 找到这一层的第一个结点
if(i!=size-1) {
cur->Next=Q.front();
cout<<"cur的值是"<<cur->data<<"指向的下一个结点的值是"<<cur->Next->data<<endl;
}
else cur->Next=NULL;
if(cur->Lchild) Q.push(cur->Lchild);
if(cur->Rchild) Q.push(cur->Rchild);
}
}
//因为是完全二叉树 一直向左深入即ke
cout<<"分层遍历树"<<endl;
BiNTree* poi=T;BiNTree* LNode=T;
while(!S.empty()){
poi=S.front();
while(poi){
cout<<poi->data<<" ";
poi=poi->Next;
}
cout<<'#';
S.pop();
}
}
main(){
int i=0;
BiNTree* T=NULL;
vector<vector<int>> result;
Creat(T);
LevelOrder(T);
}