DS二叉树——二叉树之父子结点

DS二叉树——二叉树之父子结点_第1张图片

 

 DS二叉树——二叉树之父子结点_第2张图片

 

 DS二叉树——二叉树之父子结点_第3张图片

#include 
using namespace std;
queue father;//开一个爸爸队列放爸爸
class BiTreeNode{
public:
    char date; //节点数据
    BiTreeNode *leftchild;
    BiTreeNode *rightchild;
    BiTreeNode() :leftchild(NULL),rightchild(NULL){} //初始化节点
};
class BiTree{
private:
    BiTreeNode *Root; //根节点指针
    int pos;//定位字符串位置
    string strTree;//copy字符串
    BiTreeNode *CreateBirtree();
    bool PreOrder(BiTreeNode *t);
public:
    BiTree(){}
    ~BiTree(){}
    void CreateTree(string TreeArray);//利用先序遍历结果创建二叉树
    void PreOrder()//前序遍历
    {
        PreOrder(Root);
    }
};
//构造二叉树,利用先序遍历结果创建树
void BiTree::CreateTree(string TreeArray){
    pos=0;
    strTree.assign(TreeArray);
    Root=CreateBirtree();//因为由于递归,所以要把不重复的东西单独放出来
}
//递归建树,私有函数,类内实现
BiTreeNode* BiTree::CreateBirtree(){
    BiTreeNode *T;
    char ch;
    ch=strTree[pos++];
    int flag=0;
    if(ch=='0') T=NULL;
    else{
        T=new BiTreeNode();
        T->date=ch;// 生成根节点
        T->leftchild=CreateBirtree();// 构造左子树
        T->rightchild=CreateBirtree();//构造右子树

    }
    return T;//返回已完成创建的节点
}
// 定义先序遍历函数
//为什么用bool,是叶子节点就放回true,证明上一个节点是爸爸
bool BiTree ::PreOrder(BiTreeNode *t) {
    //若节点t不空,执行以下操作
    if (t != NULL) {
        if (!t->leftchild && !t->rightchild) {//没有左右子节点了 ,返回真,上一节点是爸爸
            cout << t->date << " ";//是儿子直接输出
            return true;
        }
        bool left = PreOrder(t->leftchild);
        if (left)//为什么要分开判断,是因为一个爸爸可能是俩个儿子的爸爸
            father.push(t->date);//是爸爸放进队列;因为如果直接输出的话,还没到右边的子节点的判断就已经输出父亲了,顺序混了
        bool right = PreOrder(t->rightchild);
        if (right)
            father.push(t->date);
    }
    return false;
}
int main()
{
    //输入t,表示有t个字符串输入
    int t;cin>>t;
    for (int i = 0; i < t; ++i) {
        string str; cin>>str;
        BiTree *tree;
        tree=new BiTree();
        tree->CreateTree(str);
        tree->PreOrder();
        cout<

 

 

你可能感兴趣的:(算法,数据结构)