• 数据结构-C:二叉树的遍历


    数据结构-C:二叉树的遍历
    递归和非递归算法

    这里使用严书中的严格封闭定义,中序遍历递归算法

    二叉树定义

    typedef int Status;
    typedef char ElemType;  // 二叉树结点元素类型
    typedef struct BiTNode{ // 二叉树结点结构
    	char data;            // 结点数据
    	struct BiTNode *lchild;        // 左孩子
    	struct BiTNode *rchild;        // 右孩子
    }BiTNode, *BiTree;
    
    

    遍历函数原型

    Status PreOrderRecursionTraverse(BiTree T, Status(*Visit)(ElemType e));
    

    先序遍历递归实现

    Status PreOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){
    	if(T){
    		if(Visit(T->data))
    			if(PreOrderTraverse(T->lchild,Visit))
    				if(PreOrderTraverse(T->rchild,Visit)) return OK;
    		return ERROR;
    	}else return OK;
    }//PreOrderTraverse
    

    中序遍历递归实现

    Status InOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){
    	if(T){
    		if(InOrderTraverse(T->lchild,Visit))
    			if(Visit(T->data))
    				if(InOrderTraverse(T->rchild,Visit)) return OK;
    				return ERROR;
    	}
    }//InOrderTraverse
    

    后序遍历递归实现

    Status PostOrderTraverse(BiTree T,Status (*Visit)(TElemType e)){
    	if(T){
    		if(InOrderTraverse(T->lchild,Visit))
    			if(InOrderTraverse(T->rchild,Visit))
    				if(Visit(T->data)) return OK;
    				return ERROR;
    	}
    }//PostOrderTraverse
    

    注意这里使用了函数返回值作为是否可以进行的判断

    首先说明二叉树的创建过程:

    Status BiTree CreateBiTree(BiTree T){
    	// 按先后次序输入二叉树中结点的值(一个字符),空格表示空树
    	// 构造二叉链表表示的二叉树T
    	char ch;
    	scanf("%c",&ch);
    	if(ch=='#') T=NULL;
    	else{
    		if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
    			exit(OVERFLOW);
    		T->data=ch;                 // 生成根节点
    		T->lchild=CreateBiTree(T->lchild);    // 构造左子树
    		T->rchild=CreateBiTree(T->rchild);    // 构造右子树
    	}
    	return OK;
    }
    

    测试用例说明:
    输入

    ABC##DE#G##F###
    '#'代表子树为空树

    参考资料:

    算法之二叉树各种遍历
    http://blog.csdn.net/sjf0115/article/details/8645991
    C语言 二叉树的遍历 递归和(多种)非递归算法
    http://blog.csdn.net/nuaazdh/article/details/7621277

  • 相关阅读:
    Java finally语句到底是在return之前还是之后执行?
    RedirectAttributes
    ueditor的使用
    controller跳到另一个controller
    $.post()用法例子
    进入一个jsp直接跳到另一个jsp
    mybatis多表查询
    asp.net在网页上显示数据库中的数据
    asp.net全局记住值
    面向对象
  • 原文地址:https://www.cnblogs.com/daijkstra/p/4085951.html
Copyright © 2020-2023  润新知