【二叉树】二叉树学习小结1

一、主干功能部分代码分享
1.存储定义

struct Tree{
  char data;/*数据域*/
  struct Tree *left;/*指针域-指向左子树*/
  struct Tree *right;/*指针域-指向右子树*/
};

2.按先序遍历输入的字符序列建立二叉树,如abc,de,g,f, (其中,表示空结点)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Tree{
  char data;/*数据域*/
  struct Tree *left;/*指针域-指向左子树*/
  struct Tree *right;/*指针域-指向右子树*/
};

int k;
char st[104];

Tree * build_tree();/*建树*/

int main(){
  while(~scanf("%s", st)){
    k = 0;
    Tree *root;
    root = build_tree();
    printf("%c\n", root->data);
  }
  return 0;
}
Tree * build_tree(){
  Tree *rt;
  if(st[k] == ','){
    rt = NULL;
    k++;
  }
  else {
    k++;
    rt = (struct Tree *)malloc(sizeof(struct Tree));
    rt->data = st[k-1];
    rt->left = build_tree();
    rt->right = build_tree();
  }
  return rt;
}

3.先序遍历

void fir_vis(Tree *rt){
  if(rt){
    printf("%c", rt->data);/*根*/
    fir_vis(rt->left);/*左子树*/
    fir_vis(rt->right);/*右子树*/
  }
}

4.中序遍历

void mid_vis(Tree *rt){
  if(rt){
    mid_vis(rt->left);/*左子树*/
    printf("%c", rt->data);/*根*/
    mid_vis(rt->right);/*右子树*/
  }
}

5.后序遍历

void las_vis(Tree *rt){
  if(rt){
    las_vis(rt->left);/*左子树*/
    las_vis(rt->right);/*右子树*/
    printf("%c", rt->data);/*根*/
  }
}

6.内存释放

void del_tree(Tree *rt){
  if(rt){
    del_tree(rt->left);/*递归左子树*/
    del_tree(rt->right);/*递归右子树*/
    delete rt;/*释放根节点*/
  }
}

SDUT-数据结构实验之二叉树二:遍历二叉树
以下为Accepted代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Tree{
  char data;/*数据域*/
  struct Tree *left;/*指针域-指向左子树*/
  struct Tree *right;/*指针域-指向右子树*/
};

int k;
char st[104];

Tree * build_tree();/*建树*/
void fir_vis(Tree *rt);/*先序遍历*/
void mid_vis(Tree *rt);/*中序遍历*/
void las_vis(Tree *rt);/*后序遍历*/
void del_tree(Tree *rt);/*内存释放*/

int main(){
  while(~scanf("%s", st)){
    k = 0;
    Tree *root;
    root = build_tree();
    /*fir_vis(root);
    printf("\n");*/
    mid_vis(root);
    printf("\n");
    las_vis(root);
    printf("\n");
    del_tree(root);
  }
  return 0;
}
Tree * build_tree(){
  Tree *rt;
  if(st[k] == ','){
    rt = NULL;
    k++;
  }
  else {
    k++;
    rt = (struct Tree *)malloc(sizeof(struct Tree));
    rt->data = st[k-1];
    rt->left = build_tree();
    rt->right = build_tree();
  }
  return rt;
}
void fir_vis(Tree *rt){
  if(rt){
    printf("%c", rt->data);/*根*/
    fir_vis(rt->left);/*左子树*/
    fir_vis(rt->right);/*右子树*/
  }
}
void mid_vis(Tree *rt){
  if(rt){
    mid_vis(rt->left);/*左子树*/
    printf("%c", rt->data);/*根*/
    mid_vis(rt->right);/*右子树*/
  }
}
void las_vis(Tree *rt){
  if(rt){
    las_vis(rt->left);/*左子树*/
    las_vis(rt->right);/*右子树*/
    printf("%c", rt->data);/*根*/
  }
}
void del_tree(Tree *rt){
  if(rt){
    del_tree(rt->left);/*递归左子树*/
    del_tree(rt->right);/*递归右子树*/
    free(rt);/*释放根节点*/
  }
}

7.递归寻找叶子节点数量

int get_leaves(Tree *rt){
  if(rt == NULL) return 0;
  if(rt->left == NULL && rt->right == NULL) return 1;
  int num1 = get_leaves(rt->left);/*递归寻找左子树的叶子节点数量*/
  int num2 = get_leaves(rt->right);/*递归寻找右子树的叶子节点数量*/
  return num1+num2;
}

SDUT-数据结构实验之二叉树三:统计叶子数
以下为Accepted代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Tree{
  char data;/*数据域*/
  struct Tree *left;/*指针域-指向左子树*/
  struct Tree *right;/*指针域-指向右子树*/
};

int k;
char st[104];

Tree * build_tree();
int get_leaves(Tree *rt);
void del_tree(Tree *rt);

int main(){
  while(~scanf("%s", st)){
    Tree *root;
    k = 0;
    root = build_tree();
    printf("%d\n", get_leaves(root));
    del_tree(root);
  }
  return 0;
}
Tree * build_tree(){
  Tree *rt;
  if(st[k] == ','){
    rt = NULL;
    k++;
  }
  else {
    k++;
    rt = (struct Tree *)malloc(sizeof(struct Tree));
    rt->data = st[k-1];
    rt->left = build_tree();
    rt->right = build_tree();
  }
  return rt;
}
int get_leaves(Tree *rt){
  if(rt == NULL) return 0;
  if(rt->left == NULL && rt->right == NULL) return 1;
  int num1 = get_leaves(rt->left);/*递归寻找左子树的叶子节点数量*/
  int num2 = get_leaves(rt->right);/*递归寻找右子树的叶子节点数量*/
  return num1+num2;
}
void del_tree(Tree *rt){
  if(rt){
    del_tree(rt->left);
    del_tree(rt->right);
    free(rt);
  }
}

8.递归寻找二叉树的深度

int get_depth(Tree *rt){
  if(rt == NULL) return 0;
  int d1 = get_depth(rt->left);/*递归左子树深度*/
  int d2 = get_depth(rt->right);/*递归右子树深度*/
  if(d1 > d2) return d1+1;
  else return d2+1;
}

SDUT-数据结构实验之二叉树的建立与遍历
以下为Accepted代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Tree{
  char data;/*数据域*/
  struct Tree *left;/*指针域-指向左子树*/
  struct Tree *right;/*指针域-指向右子树*/
};

int k;
char st[104];

Tree * build_tree();
void mid_vis(Tree *rt);
void las_vis(Tree *rt);
int get_leaves(Tree *rt);
int get_depth(Tree *rt);
void del_tree(Tree *rt);

int main(){
  while(~scanf("%s", st)){
    Tree *root;
    k = 0;
    root = build_tree();
    mid_vis(root);
    printf("\n");
    las_vis(root);
    printf("\n");
    printf("%d\n", get_leaves(root));
    printf("%d\n", get_depth(root));
    del_tree(root);
  }
  return 0;
}
Tree * build_tree(){
  Tree *rt;
  if(st[k] == ','){
    rt = NULL;
    k++;
  }
  else {
    k++;
    rt = (struct Tree *)malloc(sizeof(struct Tree));
    rt->data = st[k-1];
    rt->left = build_tree();
    rt->right = build_tree();
  }
  return rt;
}
void mid_vis(Tree *rt){
  if(rt){
    mid_vis(rt->left);
    printf("%c", rt->data);
    mid_vis(rt->right);
  }
}
void las_vis(Tree *rt){
  if(rt){
    las_vis(rt->left);
    las_vis(rt->right);
    printf("%c", rt->data);
  }
}
int get_leaves(Tree *rt){
  if(rt == NULL) return 0;
  if(rt->left == NULL && rt->right == NULL) return 1;
  int num1 = get_leaves(rt->left);/*递归寻找左子树的叶子节点数量*/
  int num2 = get_leaves(rt->right);/*递归寻找右子树的叶子节点数量*/
  return num1+num2;
}
int get_depth(Tree *rt){
  if(rt == NULL) return 0;
  int d1 = get_depth(rt->left);/*递归左子树深度*/
  int d2 = get_depth(rt->right);/*递归右子树深度*/
  if(d1 > d2) return d1+1;
  else return d2+1;
}
void del_tree(Tree *rt){
  if(rt){
    del_tree(rt->left);
    del_tree(rt->right);
    free(rt);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值