前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构算法整理-05-二叉树

数据结构算法整理-05-二叉树

作者头像
devi
发布2021-08-18 15:40:39
2510
发布2021-08-18 15:40:39
举报
文章被收录于专栏:搬砖记录


以下基本都是用递归实现

1. 定义

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 20

typedef  char   datatype;
typedef struct BiNode
{
    datatype data;
    struct BiNode  *lchild, *rchild;
}bitree;

2. 前序遍历

代码语言:javascript
复制
//前序遍历的递归算法 
void   PreOrder( bitree  *root) 
{
        if (root ==NULL)  return;     
        else {
            printf("%d  ",root->data);         
            PreOrder( root->lchild);    
            PreOrder(root->rchild);    
        }
 }

3. 中序遍历

代码语言:javascript
复制
//中序遍历的递归算法 
void InOrder (bitree  *root)
{
         if (root==NULL) return;     
         else {
         	InOrder(root->lchild); 
 	     	printf("%d  ",root->data);
	       	InOrder(root->rchild);
         }
}

4. 后序遍历

代码语言:javascript
复制
//后序遍历的递归算法 
void  PostOrder(bitree  *root)
{ 
    if (root==NULL) return; 
    else {
         PostOrder(root->lchild); 
         PostOrder(root->rchild); 
         printf("%d  ",root->data);
    }
}

5. 前序遍历的非递归算法 (了解)

代码语言:javascript
复制
//前序遍历的非递归算法  
void  PreOrder1( bitree  *root ) 
{   bitree  *p=root ;
 	bitree  *s[Maxsize]; int top;
     top= -1;      //采用顺序栈,并假定不会发生上溢
     while (p!=NULL || top!= -1)
     {
         while (p!= NULL)
         {
			printf("%d  ",p->data);
   			s[++top]=p;
      		p = p->lchild;  
         }
         if (top!= -1) { 
             p=s[top--];
             p=p->rchild;  
         }
     }
}

6. 创建二叉树

代码语言:javascript
复制
//以递归方式创建二叉树,如输入:ABD##E##C#FHJ##K##I## (按前中后序输入,空节点用#代替)
bitree * creatBitree()
{   bitree *root ;char ch;
    ch=getchar();
    if (ch == '#')     root = NULL; 
    else {
        root=(bitree*)malloc(sizeof(bitree)); 
        root->data=ch; 
        root->lchild =creatBitree(); 
        root->rchild= creatBitree(); 
     } 	
    return root;
}

7. 删除二叉树

代码语言:javascript
复制
//删除二叉树 
bitree * deleteTree(bitree  *root)
{	if( root!=NULL)
	{   
	 	deleteTree(root->lchild);
	 	deleteTree(root->rchild);
	    free(root);	
	} 	
   root=NULL; //free只是释放了指针所指空间,并没有自动将指针root为空,需要手动置root为空。只有删除完所有结点置root为空,测试整颗二叉树上结点总数才为0 
   return root;
}

8. 二叉树深度计算

代码语言:javascript
复制
//计算二叉树的深度 
int  Depth(bitree *root)
{  int hl = 0, hr = 0; 
    if (root == NULL) return 0;
    else {
         hl= Depth(root ->lchild);
         hr= Depth(root ->rchild);
         return hl>=hr ? (hl+1) : (hr+1);
    }
}

9. 计算结点总数

代码语言:javascript
复制
int count=0;
void CountNode(bitree *root)  //n为结点总数 
{
    if (root) {
    	count++;
    	CountNode(root->lchild);
    	CountNode(root->rchild);
   }
}

10. 计算叶子结点总数

代码语言:javascript
复制
//计算叶子结点总数 
int count=0;
void leafNum(bitree  *root)
{
	if (root) {
		leafNum(root->lchild);
    	leafNum(root->rchild);
    	if(root->lchild==NULL&&root->rchild==NULL)
	    	count++;
   }
}

11.广义表的形式输出二叉树结构

在这里插入图片描述
在这里插入图片描述

广义表表示 :L = (A (B (C, D), E ( , F) ) ) 可以得出

  • 若为空,则打印空格
  • 基本元素根(左,右)

可以抽出基本代码:

若为空: 打印空格; 否则: 打印根; 若子不为空: 打印"("; 打印左子树; 打印“,”; 打印右子树; 打印“)”;

显然,存在递归,将需要递归的地方(打印左子树\打印右子树)改成递归即可

代码语言:javascript
复制
//以广义表的形式输出二叉树结构
void displayBitree(bitree  *root)
{
	if( root == NULL)
	{
		printf(" "); return ;
	}
	
	printf("%d", root->data);
	
	if( root->lchild || root->rchild)
	{
		printf("\(");
		displayBitree(root->lchild);
		printf(",");
		displayBitree(root->rchild);
		printf("\)");
	}	
}

记忆总结

  1. 定义:根节点、左子节点、右子节点
  2. 遍历算法:若根不为空 ,则打印(递归),然后递归(打印)
  3. 计算总节点数:遍历一次就使全局变量count+1;
  4. 计算叶子节点数:将深度遍历完之后,如果左右节点都为空(说明是叶子),则使全局变量count+1;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 定义
  • 2. 前序遍历
  • 3. 中序遍历
  • 4. 后序遍历
  • 5. 前序遍历的非递归算法 (了解)
  • 6. 创建二叉树
  • 7. 删除二叉树
  • 8. 二叉树深度计算
  • 9. 计算结点总数
  • 10. 计算叶子结点总数
  • 11.广义表的形式输出二叉树结构
  • 记忆总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档