#include<cstdio>
#include<queue>
using namespace std;
struct TreeNode{
char data;
TreeNode * LChild;
TreeNode * RChild;
};
struct QueueNoede{
TreeNode *parent;
bool isLChildIn;
};
void insertTreeNode(TreeNode * &root ,queue<QueueNoede *> &myQue,char data){
if(data != '#'){
//创建二叉树节点,因为是在被调函数内部创建
//所以要申请堆空间而不是栈空间
TreeNode *pTreeNode = new TreeNode;
(*pTreeNode).data = data;//创建完了对象
// (*pTreeNode).data = pTreeNode -> data
//入队,把刚刚建好的二叉树结点,把其地址信息有没有插过左孩子加入队列;
QueueNoede *pQueNode = new QueueNoede;//额外的空间
pQueNode->parent = pTreeNode;
pQueNode->isLChildIn = false;
myQue.push(pQueNode);//入队;
if(root == NULL){
root = pTreeNode;//是不是第一个结点
}else{
QueueNoede *pParent = myQue.front();
//pParent定位新加的节点的父亲节点
if(pParent->isLChildIn == false){
pParent-> parent->LChild = pTreeNode;
pParent->isLChildIn = true;
}else{
pParent->parent->RChild = pTreeNode;
myQue.pop();//左右孩子都插入了就出队;
delete pParent;//把内存释放
}
}
}else{
//是'#'情况
//插入空结点还是找父亲,然后左右孩子置为空
if(root != NULL){
QueueNoede *pParent = myQue.front();
if(pParent->isLChildIn == false){
pParent->parent->LChild = NULL;
pParent->isLChildIn = true;
}else{
pParent->parent->RChild = NULL;
myQue.pop();
delete pParent;
}
}
}
}
int main(){
TreeNode *root = NULL;
queue<QueueNoede *> myQue;//存储新节点的父亲
char charList[] = "abc##de#g##f###";
for(int i = 0 ; charList[i] !='\0';++i){
insertTreeNode(root,myQue,charList[i]);
}
}
层序遍历建立二叉树
最新推荐文章于 2023-07-10 23:50:03 发布