• 实用数据结构总结之二叉树遍历


    二叉树简单总结:
    二叉树节点结构:
    struct Node{
    Node *lchild;//指向其左儿子节点的指针,当其不存在左儿子时为NULL
    Node *rchild;//指向其右儿子节点的指针,当其不存在右儿子时为NULL
    /*
    节点附加信息
    .....
    */
    }
    对于该结构,先序遍历,中序遍历,后序遍历分别为:
    先序遍历:

    void preOrder(Node *Tree)
    {
    /*
    对当前节点Tree的遍历操作
    */
    if(Tree->lchild !=NULL)//递归遍历左子树
    preOrder(Tree->lchild);
    if(Tree->rchild != NULL)//递归遍历右子树
    preOrder(Tree->rchild);
    return;
    }

    void inOrder(Node *Tree)
    {
    if(Tree->lchild !=NULL)//递归遍历左子树
    preOrder(Tree->lchild);
    /*
    对当前节点Tree的遍历操作
    */
    if(Tree->rchild != NULL)//递归遍历右子树
    preOrder(Tree->rchild);
    return;
    }

    void postOrder(Node *Tree)
    {
    if(Tree->lchild !=NULL)//递归遍历左子树
    preOrder(Tree->lchild);
    if(Tree->rchild != NULL)//递归遍历右子树
    preOrder(Tree->rchild);
    /*
    对当前节点Tree的遍历操作
    */
    return;
    }
    例题:通过先序遍历和中序遍历确定后序遍历
    输入:
    两个字符串,其长度n均小于等于26
    第一行为先序遍历,第一行为中序遍历
    输出:
    输入样例为多组,对于每组测试用例,输出一行,为后序遍历字符串

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    struct Node//二叉树结点结构体
    {
    	Node *lchild;//左儿子指针
    	Node *rchild;//右儿子指针
    	char c;//结点字符信息
    }Tree[50];//静态内存分配数组
    
    int loc;//静态数组中已经分配的结点个数
    
    Node *create()//申请一个结点空间,返回指向其的指针
    {
    	Tree[loc].lchild = Tree[loc].rchild = NULL;//初始化左右儿子为空
    	return &Tree[loc++];//返回指针,loc自增
    }
    
    char str1[30],str2[30];//先序和中序字符串
    
    void postOrder(Node *T)//后序遍历
    {
    	if (T->lchild!=NULL)
    	postOrder(T->lchild);
    	if (T->rchild!=NULL)
    	postOrder(T->rchild);
       cout<<T->c;
    }
    
    Node *buildtree(int s1,int e1,int s2,int e2)
    {
    //由字符串的先序遍历和中序遍历还原树,并返回其根节点,其中
    //其中先序遍历结果由str1[s1]到str1[e1],中序遍历结果由str2[s2]
    //到str2[e2]
    Node* ret = create();//为该树根结点申请空间
    ret->c = str1[s1];//先序遍历第一个字符
    int rootindex;
    for (int i=s2;i<=e2;i++)
    {
    	if (str2[i] == str1[s1])
    	{
    		rootindex = i;
    		break;
    	}
    }
    if (rootindex !=s2)//若左子树不为空
    {
    	ret->lchild = buildtree(s1+1,s1+(rootindex -s2),s2,rootindex-1);
    }
    if (rootindex !=e2)
    {
    	ret->rchild = buildtree(s1+(rootindex - s2)+1,e1,rootindex+1,e2);
    }
    return  ret;
    
    }
    
    int main()
    {
    	while(cin>>str1>>str2)
    	{
    		loc = 0;
    		int L1 = strlen(str1);
    		int L2 = strlen(str2);
    
    		Node * T = buildtree(0,L1-1,0,L2-1);
    
    		postOrder(T);
    		cout<<endl;
    	}
    	
      //  system("pause");
    	return 0;
    }


     

  • 相关阅读:
    【CSS】flex 布局 justifycontent:spacebetween;解决最后一排数量不够自动向两端排列问题
    【Vue】NavBar 顶部弹窗点击弹窗击空白区域关闭弹窗实现
    【patchpackage】基本使用,给修改的 node_modules 下源码“打补丁”
    【FSResizer】faststone下图片神器
    【pandas】按照数据列中元素出现的先后顺序进行分组排列(最后一种个人原创)
    【PC】微信多开bat
    【正则表达式应用】不规则多维数组展平一维
    【首发】【Navicat premium 16】激活完整记录
    【原创】彻底解决GitHub访问慢的问题(只需三招)
    【Edge浏览器】8大隐藏功能,开启更好用
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3313095.html
Copyright © 2020-2023  润新知