问题 C: 二叉树非递归后序遍历-附加代码模式

题目描述

用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树,请用非递归算法实现二叉树的后序遍历。
本题为附加代码模式,以下代码为自动附加在同学们提交的代码后面。在本题的提示中有代码框架(若使用在线vscode答题的同学请注意不要拷贝题目中的代码框架,自己手打,不然会被封号。),请同学们拷贝后,修改,再注释掉部分代码,最后提交。

// please comment the following code when you sumbit to OJ
int main(){
    // char *str = "abd###ceg##h##f#i##";
    char str[2000];
    while(cin >> str)
    {
        BiTree tree;
        InitBiTree(tree);
        // 根据带空节点的前序遍历字符串构造二叉树
        CreateBiTree(tree, str);
        // 后序遍历递归算法
        SucTraverse(tree);
        cout << endl;
        // 后序遍历非递归算法
        string result = SucTraverse_nonRec(tree);
        cout << result << endl;
        DestroyBiTree(tree);
    }
    return 0;
}

输入格式

每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过2000。每个结点为一个小写字母或一个数字。

输出格式

对每行输入,分别用递归和非递归两种算法输出对应二叉树的后序遍历序(不含虚结点)

输入样例

ab##c##
#
ab###

输出样例  

bca
bca


ba
ba

数据范围与提示

Sample Input的第二行表示一棵空树;

 

//代码的框架如下:


#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

struct BiNode
{
    string data;
    BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;

int InitBiTree(BiTree &T)
{
    T = NULL;
    return 0;
}

// 非递归后序遍历,返回遍历结果字符串
string SucTraverse_nonRec(BiTree T)
{
    // please write your code here
    string result = "";
    return result;
}

// 用带虚结点的前序遍历串str(每个字符对应一个结点)构造二叉树T,并返回剩余字符串
char *CreateBiTree(BiTree &T, char *str)
{
    // 约定#表示空结点
    if (*str == '#')
    {
        T = NULL;
        return str + 1;
    }

    // 创建结点
    T = new BiNode;
    T->data = *str;

    // 继续输入并构造左子树和右子树
    char * strAfterLeft = CreateBiTree(T->lchild, str + 1);
    char * strAfterRight = CreateBiTree(T->rchild, strAfterLeft);

    // 返回剩余的字符串
    return strAfterRight;
}

int SucTraverse(BiTree T){
    if (T == NULL) return 0;
    SucTraverse(T->lchild);
    SucTraverse(T->rchild);
    cout << T->data;
    return 0;
}

int DestroyBiTree(BiTree &T){
    if (T == NULL) return 0;
    DestroyBiTree(T->lchild);
    DestroyBiTree(T->rchild);
    delete T;
    T = NULL;
    return 0;
}

// please comment the following code when you sumbit to OJ
int main(){
    // char *str = "abd###ceg##h##f#i##";
    char str[2000];
    while(cin >> str)
    {
        BiTree tree;
        InitBiTree(tree);
        // 根据带空节点的前序遍历字符串构造二叉树
        CreateBiTree(tree, str);
        // 后序遍历递归算法
        SucTraverse(tree);
        cout << endl;
        // 后序遍历非递归算法
        string result = SucTraverse_nonRec(tree);
        cout << result << endl;
        DestroyBiTree(tree);
    }
    return 0;
}

代码展示 

省流:

//非递归后序遍历
string SucTraverse_nonRec(BiTree T){
	string result="";
	if(T==NULL)  return "";
	stacks;
	BiNode *p=T,*r=NULL;
	while(p!=NULL||!s.empty()){
		if(p!=NULL&&p!=r){
			s.push(p);
			p=p->lchild;//往左走到头
		}
		else{
			p=s.top();//读取栈顶元素
			if(p->rchild&&p->rchild!=r){//如果存在左子节点且未被访问过
				p=p->rchild;
				s.push(p);//右子结点入栈
				p=p->lchild;//重复第一步(往左走到头)
			}
			else{
				result+=s.top()->data;
				s.pop();//符合条件的出栈
				r=p;//对访问过的结点进行标记
				if(s.empty())  p=NULL;//栈空退出
			}
		}
	}
	return result;
}

完整:

#include
#include
#include
#include
#include
#include
using namespace std;

struct BiNode{
	string data;
	BiNode *lchild,*rchild;
};
typedef BiNode *BiTree;

int InitBiTree(BiTree &T){
	T=NULL;
	return 0;
}

//非递归后序遍历
string SucTraverse_nonRec(BiTree T){
	string result="";
	if(T==NULL)  return "";
	stacks;
	BiNode *p=T,*r=NULL;
	while(p!=NULL||!s.empty()){
		if(p!=NULL&&p!=r){
			s.push(p);
			p=p->lchild;//往左走到头
		}
		else{
			p=s.top();//读取栈顶元素
			if(p->rchild&&p->rchild!=r){//如果存在左子节点且未被访问过
				p=p->rchild;
				s.push(p);//右子结点入栈
				p=p->lchild;//重复第一步(往左走到头)
			}
			else{
				result+=s.top()->data;
				s.pop();//符合条件的出栈
				r=p;//对访问过的结点进行标记
				if(s.empty())  p=NULL;//栈空退出
			}
		}
	}
	return result;
}

//用带虚节点的前序遍历串构造二叉树
char *CreateBiTree(BiTree &T,char *str){
	if(*str=='#'){
		T=nullptr;
		return str+1;
	}
	T=new BiNode;
	T->data=*str;
	char * strAfterLeft=CreateBiTree(T->lchild,str+1);
	char * strAfterRight=CreateBiTree(T->rchild,strAfterLeft);
	return strAfterRight;
}

int SucTraverse(BiTree T){//后序遍历
	if(T==nullptr)  return 0;
	SucTraverse(T->lchild);
	SucTraverse(T->rchild);
	cout<data;
	return 0;
}

int DestroyBiTree(BiTree &T){//销毁二叉树
	if(T==nullptr)  return 0;
	DestroyBiTree(T->lchild);
	DestroyBiTree(T->rchild);
	delete T;
	T=nullptr;
	return 0;
}
/*
int main(){
	freopen("/config/workspace/test/test","r",stdin);
	char str[2000];
	while(cin>>str){
		BiTree tree;
		InitBiTree(tree);
		CreateBiTree(tree,str);
		SucTraverse(tree);
		cout<

你可能感兴趣的:(2022.11.3作业,数据结构)