• 二叉树


    二叉树:二叉树是每个节点最多只有两个子节点的树,且子节点有左右之分。

    满二叉树:一棵深度为k,且有2^k-1个节点的二叉树称为满二叉树。

    完全二叉树:二叉树中,每个节点的序号都与相同的深度满二叉树序号完全一致,称为完全二叉树。

    二叉树的遍历:二叉树的遍历通常有三种主要的方法,前序遍历、中序遍历和后序遍历,三种方法都是递归实现的。

    1. 前序遍历
    访问根节点
    遍历左子树
    遍历右子树

    2. 中序遍历
    遍历左子树
    访问根节点
    遍历右子树

    3. 后序遍历
    遍历左子树
    遍历右子树
    访问根节点

    二叉树例子如下:

    完整代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct node {
    	int data;
    
    	struct node *left;
    	struct node *right;
    };
    
    int tree_nodes[] = {	'A', 'B', 'D', '#', '#', '#', 'C', 'E',
    			'#', 'G', '#', '#', 'F', 'H', '#', '#', 'J', '#', '#'};
    
    int node_index = 0;
    
    void tree_destroy(struct node *leaf)
    {
    	if (leaf != NULL) {
    		tree_destroy(leaf->left);
    		tree_destroy(leaf->right);
    		free(leaf);
    	}
    }
    
    void tree_create(struct node **leaf)
    {
    	if (tree_nodes[node_index] == '#') {
    		*leaf = NULL;
    		node_index++;
    	} else {
    		*leaf = (struct node *)malloc(sizeof(struct node));
    		(*leaf)->data = tree_nodes[node_index++];
    		tree_create(&(*leaf)->left);
    		tree_create(&(*leaf)->right);
    	}
    }
    
    void preorder(struct node *root)
    {
    	if (root != NULL) {
    		printf("%5c", root->data);
    		preorder(root->left);
    		preorder(root->right);
    	}
    }
    
    void inorder(struct node *root)
    {
    	if (root != NULL) {
    		inorder(root->left);
    		printf("%5c", root->data);
    		inorder(root->right);	
    	}
    }
    
    void postorder(struct node *root)
    {
    	if (root != NULL) {
    		postorder(root->left);
    		postorder(root->right);
    		printf("%5c", root->data);
    	}
    }
    
    int main(void)
    {
    	struct node *root;
    
    	tree_create(&root);
    
    	preorder(root);
    	printf("
    ");
    
    	inorder(root);
    	printf("
    ");
    
    	postorder(root);
    	printf("
    ");
    
    	tree_destroy(root);
    
    	return 0;
    }

    二叉树的创建使用了前序遍历方式创建的,其中使用了'#'字符,如果遇见该符号,表示子节点为空。

    前序遍历、中序遍历和后序遍历结果为:

        A    B    D    C    E    G    F    H    J
        D    B    A    E    G    C    H    F    J
        D    B    G    E    H    J    F    C    A

  • 相关阅读:
    一文告诉你,为什么要研究JVM原理
    高并发中使用到的RateLimiter源码解析
    WEB应用服务架构的演变(扫盲)
    网上安全方面的涉及到的方面(详解)
    JDK安装
    JDKJRKSDK的区别
    本地同时安装oracle客户端与服务端的注意事项
    WMS不同货主的货如何管理
    LeetCode 101
    WMS一物一码、唯一码
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3329064.html
Copyright © 2020-2023  润新知