zoukankan      html  css  js  c++  java
  • 【12】算法(遍历二叉树+代码详解)

     概念

    二叉树:

      树中每个节点最多有两个;

    二叉搜索树:

      1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
      2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
      3.任意结点的左、右子树也分别为二叉搜索树。 

    二叉排序树:

      1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
      2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
      3. 它的左右子树也分别为二叉排序树。

    二叉查找树:

      又称二叉排序树;以根节点为中心,左边的都比它小,右边的都比它大;

    平衡二叉树:

      是二叉排序树的改进版;

      它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树

    满二叉树:

      树中所有的叶子节点都在同一层,每个节点都有两个子节点(每一层节点数达到最大值)

    完全二叉树:

      满足满二叉树的前提下,最后一层叶子均在最左边;(完全二叉树不是满二叉树, 满二叉树是完全二叉树)

    二叉树的遍历

     

    完整代码

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct tNode
    {
            char data;
            struct tNode * lson; // 左孩子
            struct tNode * rson; // 右孩子
    }tNode;
    
    // 创建树即创建根节点
    tNode * CreateNode (char data)
    {
            tNode * tree = (tNode *) malloc (sizeof(tNode));
            tree->data = data;
            tree->lson = NULL;
            tree->rson = NULL;
            return tree;
    }
    
    // 连接节点, 将没有规律的树连接起来
    void InsertNode(tNode * curNode, tNode * lNode, tNode * rNode)
    {
            curNode->lson = lNode;
            curNode->rson = rNode;
    }
    
    // 递归遍历,每个节点打印出来
    // 打印表示遍历, 打印当前节点数据
    void PrintData(tNode * curNode)
    {
            printf("%c  ", curNode->data);
    }
    
    // 先序
    void PreOrder(tNode * curNode)
    {
            if (curNode == NULL) return;
            PrintData(curNode);
            PreOrder(curNode->lson);
            PreOrder(curNode->rson);
    }
    
    // 中序
    void MidOrder(tNode * curNode)
    {
            if (curNode == NULL) return;
            MidOrder(curNode->lson);
            PrintData(curNode);
            MidOrder(curNode->rson);
    }
    
    // 后序
    void EndOrder(tNode * curNode)
    {
            if (curNode == NULL) return;
            EndOrder(curNode->lson);
            PrintData(curNode);
            EndOrder(curNode->rson);
    }
    
    int main()
    {
            // 创建树,此时还是乱的
            tNode * A = CreateNode('A');
            tNode * B = CreateNode('B');
            tNode * C = CreateNode('C');
            tNode * D = CreateNode('D');
            tNode * E = CreateNode('E');
            tNode * F = CreateNode('F');
            tNode * G = CreateNode('G');
            tNode * H = CreateNode('H');
            tNode * I = CreateNode('I');
            tNode * J = CreateNode('J');
            tNode * K = CreateNode('K');
    
            // 连接树
            InsertNode(A, B, C);
            InsertNode(B, D, E);
            InsertNode(C, F, G);
            InsertNode(D, H, I);
            InsertNode(H, K, NULL);
            InsertNode(E, J, NULL);
    
            printf("前序遍历: ");
            PreOrder(A);
            printf("
    ");
    
            printf("中序遍历: ");
            MidOrder(A);
            printf("
    ");
    
            printf("后序遍历: ");
            EndOrder(A);
            printf("
    ");
    
    }

     

    做一个优秀的程序媛
  • 相关阅读:
    Coolite comboBox控件动态显示树形结构(无限树)
    WinXP 允许搜索PHP格式
    LINQ To DataSet 几个常用示例
    在Windows系统上安装PHP工作环境
    将LINQ To DataSet 传回之对象集转成DataTable的函数
    .net wsdl文件用法
    上班了,抱怨一下
    写在情人节
    快乐云南行
    单车骑天下 VS 公益旅游活动
  • 原文地址:https://www.cnblogs.com/oytt/p/13597555.html
Copyright © 2011-2022 走看看