二叉树的各种基本运算

二叉树的各种基本运算


码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创

  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。

  在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。维基百科-二叉树


码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创

实验环境


  • 语言c/c++
  • 编译器devc++5.11/5.40


实验内容与要求

二叉树

  1. 编写一个程序,建立如图所示二叉树。
  2. 实现二叉树的先序遍历、中序遍历和后序遍历的各种递归算法,要求设计一个菜单提供遍历种类的选择。


目录


码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创


实验解析

结构说明


二叉树nn≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

在此,我们利用二叉链表的形式来定义二叉树:

typedef   struct   BiTNode{
    TElemType    data;
    struct   BiTNode *lchild , *rchild;
}BiTNode,*BiTree;

二叉链表的结点结构如图所示。

二叉链表的结点结构


定义说明



#define OVERFLOW 0
#define OK 1
#define ERROR 0

typedef  int  Status;
typedef  char TElemType;
    char ch[] = {'A', 'B', 'D','#','#','E','H','J','#','#','K','L','#','#','M','#','N','#','#','#','C','F','#','#','G','#','I','#','#'};//简易版,先序排列,空节点以#代替,可以加一个输入来自己写二叉树。因为创建二叉树是自我递归,所以要设为全局变量
    int j =0 ;//因为创建二叉树是自我递归,所以要设为全局变量,可以使用栈来替换递归。

  定义常用常量,类型别称


函数说明


二叉树函数

创建二叉树
Status CreateBiTree(BiTree &T){

    if(ch[j]=='#') {
        T=NULL;
        j++;
    }else{
        if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) 
            exit(OVERFLOW);
        T->data=ch[j];
        j++;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
    return OK;
} 

   给二叉树分配空间 ,建立二叉树空间结构,成功返回1,失败则结束程序。 使用二叉树一定要先初始化再使用


先序遍历输出
Status PreOrderTraverse(BiTree  T){ 
    if(T) {  
        printf("%c",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
        return  OK;
    }else   
        return  ERROR; 
}//PreOrderTraverse

  以前序遍历输出二叉树,成功返回1,失败返回0。

​ 遍历二叉树:L、D、R分别表示遍历左子树、访问根结点和遍历右子树,则先(根)序遍历二叉树的顺序是DLR,中(根)序遍历二叉树的顺序是LDR,后(根)序遍历二叉树的顺序是LRD。维基百科-遍历二叉树


中序遍历输出
Status InOrderTraverse(BiTree T){ 
    if(T) { 
        InOrderTraverse(T->lchild); 
        printf("%c",T->data); 
        InOrderTraverse(T->rchild); 
        return  OK;
    }else   
        return  ERROR; 
}

  以中序遍历输出二叉树,成功返回1,失败返回0。


后序遍历输出
Status PostOrderTraverse(BiTree T){ 
    if(T) { 
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild); 
        printf("%c",T->data); 
        return  OK;
   }else   
        return  ERROR; 
}

  以后序遍历输出二叉树,成功返回1,失败返回0。


释放
Status DestroyBiTree (BiTree &T) {     
    if (!T)  
        return ERROR; 
    DestroyBiTree(T->lchild);
    DestroyBiTree(T->rchild);
    free(T);
    if(!T)    
        return OK;
}

   释放传入的二叉树,成功返回1,失败返回0


主函数


main(){

    int i;
    BiTree T;
    CreateBiTree(T);
    printf("输入1进行先序遍历\n输入2进行中序遍历\n输入3进行后序遍历\n");
    scanf("%d",&i);
    if(T){
        switch(i){
            case 1:
                PreOrderTraverse(T);
                break;
            case 2:
                InOrderTraverse(T); 
                break;
            case 3:
                PostOrderTraverse(T);
                break;
            default:    
                printf("error\n");
        }
    }
    DestroyBiTree(T);   
}


结果展示


二叉树先序遍历结果截图

二叉树中序遍历结果截图

二叉树后序遍历结果截图

结果正确


附录

相关资料

  1. 维基百科-二叉树
  2. 维基百科-遍历二叉树


源代码

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创


#include<stdio.h>
#include<stdlib.h>
#include <string> 
#define OVERFLOW 0
#define OK 1
#define ERROR 0

typedef  int  Status;
typedef  char TElemType;
char ch[] = {'A', 'B', 'D','#','#','E','H','J','#','#','K','L','#','#','M','#','N','#','#','#','C','F','#','#','G','#','I','#','#'};
int j =0 ;

typedef   struct   BiTNode{
    TElemType    data;
    struct   BiTNode *lchild,*rchild;
}BiTNode,*BiTree;



Status CreateBiTree(BiTree &T){

    if(ch[j]=='#') {
        T=NULL;
        j++;
    }else{
        if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) 
            exit(OVERFLOW);
        T->data=ch[j];
        j++;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
    return OK;
} 

Status PreOrderTraverse(BiTree  T){ 
    if(T) {  
        printf("%c",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
        return  OK;
    }else   
        return  ERROR; 
}//PreOrderTraverse

Status InOrderTraverse(BiTree T){ 
    if(T) { 
        InOrderTraverse(T->lchild); 
        printf("%c",T->data); 
        InOrderTraverse(T->rchild); 
        return  OK;
    }else   
        return  ERROR; 
}

Status PostOrderTraverse(BiTree T){ 
    if(T) { 
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild); 
        printf("%c",T->data); 
        return  OK;
   }else   
        return  ERROR; 
}

Status DestroyBiTree (BiTree &T) {     
    if (!T)  
        return ERROR; 
    DestroyBiTree(T->lchild);
    DestroyBiTree(T->rchild);
    free(T);
    if(!T)    
        return OK;
}

main(){

    int i;
    BiTree T;
    CreateBiTree(T);
    printf("输入1进行先序遍历\n输入2进行中序遍历\n输入3进行后序遍历\n");
    scanf("%d",&i);
    if(T){
        switch(i){
            case 1:
                PreOrderTraverse(T);
                break;
            case 2:
                InOrderTraverse(T); 
                break;
            case 3:
                PostOrderTraverse(T);
                break;
            default:    
                printf("error\n");
        }
    }
    DestroyBiTree(T);   
}

码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创

  • 18
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树基本运算程序包括二叉树的创建、遍历、查找、插入、删除等操作。下面是一个简单的二叉树基本运算程序的示例: ```python # 定义二叉树节点类 class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None # 创建二叉树 def create_tree(s): if not s: return None stack = [] root = None is_left = True for i in s: if i == '(': stack.append(node) is_left = True elif i == ',': is_left = False elif i == ')': stack.pop() else: node = TreeNode(i) if not root: root = node elif is_left: stack[-1].left = node else: stack[-1].right = node return root # 前序遍历 def preorder_traversal(root): if not root: return print(root.val, end=' ') preorder_traversal(root.left) preorder_traversal(root.right) # 中序遍历 def inorder_traversal(root): if not root: return inorder_traversal(root.left) print(root.val, end=' ') inorder_traversal(root.right) # 后序遍历 def postorder_traversal(root): if not root: return postorder_traversal(root.left) postorder_traversal(root.right) print(root.val, end=' ') # 查找节点 def find_node(root, val): if not root: return None if root.val == val: return root left = find_node(root.left, val) if left: return left right = find_node(root.right, val) if right: return right return None # 插入节点 def insert_node(root, val): if not root: return TreeNode(val) if not root.left: root.left = TreeNode(val) elif not root.right: root.right = TreeNode(val) else: insert_node(root.left, val) return root # 删除节点 def delete_node(root, val): if not root: return None if root.val == val: if not root.left: return root.right if not root.right: return root.left min_node = root.right while min_node.left: min_node = min_node.left root.val = min_node.val root.right = delete_node(root.right, min_node.val) elif root.val > val: root.left = delete_node(root.left, val) else: root.right = delete_node(root.right, val) return root # 获取二叉树高度 def get_height(root): if not root: return 0 left_height = get_height(root.left) right_height = get_height(root.right) return max(left_height, right_height) + 1 # 释放二叉树 def free_tree(root): if not root: return free_tree(root.left) free_tree(root.right) del root # 测试 s = "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))" root = create_tree(s) print("前序遍历:", end='') preorder_traversal(root) print() print("中序遍历:", end='') inorder_traversal(root) print() print("后序遍历:", end='') postorder_traversal(root) print() node = find_node(root, 'H') if node: print("H结点的左孩子结点值:", node.left.val) print("H结点的右孩子结点值:", node.right.val) print("二叉树的高度:", get_height(root)) root = delete_node(root, 'H') print("删除H结点后的中序遍历:", end='') inorder_traversal(root) print() free_tree(root) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值