BST

圖片描述

江南無所謂 聊贈一枝春

前言

  • 二叉搜索樹插入
  • 二叉搜索樹遍歷
  • 二叉搜索樹高度
  • 二叉搜索樹最大值

什麼是二叉搜索樹

滿足條件: 左節點值 < 根節點值 < 右節點值

定義樹節點

    typedef struct TreeNode {
        int data;
        struct TreeNode *left;
        struct TreeNode *right;
    } TreeNode;

定義樹

    typedef struct tree {
        struct TreeNode *root;
    } Tree;

二叉搜索樹的插入

插入節點

    void insertNode (Tree *tree, int value) {
        TreeNode *node1 = malloc(sizeof(TreeNode));
        node1->data = value;
        node1->left = NULL;
        node1->right = NULL;
        
        if(tree->root == NULL){
            tree->root = node1;
        } else {
            TreeNode *temp = tree->root;
            while (temp != NULL) {
                if(value < temp->data){
                    if(temp->left == NULL) {
                        temp->left = node1;
                        return ;
                    } else {
                       temp = temp->left;
                    }
                    
                } else {
                    if(temp->right == NULL) {
                        temp->right = node1;
                        return;
                    } else {
                       temp = temp->right;
                    }
                }
            }
        }
    }

BST的前中後序遍歷

    // 前序遍歷 根->左->右
    void preorderTraverse(TreeNode *tree) {
        if(tree == NULL) {return;}
        NSLog(@"%d ", tree->data);
        preorderTraverse(tree->left);
        preorderTraverse(tree->right);
    }
    
    //中序遍歷 左->根->右
    void midTraverse(TreeNode *tree) {
        if(tree == NULL) {return;}
        midTraverse(tree->left);
        NSLog(@"%d ", tree->data);
        midTraverse(tree->right);
    }
    
    //後序遍歷 左->右->根
    void postorderTraversal(TreeNode *tree) {
        if(tree == NULL) {return;}
        postorderTraversal(tree->left);
        postorderTraversal(tree->right);
        NSLog(@"%d ", tree->data);
    }

二叉搜索樹高度


    int getBSTHeight (TreeNode *node) {
        if (node == NULL) {
            return 0;
        } else {
            int leftH = getBSTHeight(node->left);
            int rightH = getBSTHeight(node->right);
            int max = leftH;
            if (max < rightH) {
                max = rightH;
            }
            return max+1;
        }
    }

二叉搜索樹最大值

    int getMaxNum(TreeNode *node) {
        if (node == NULL) {
            return -1;
        } else {
            int leftMax = getMaxNum(node->left);
            int rightMax = getMaxNum(node->right);
            int current = node->data;
            int max = leftMax;
            if (rightMax > max) {
                max = rightMax;
            }
            if (current>max) {
                max = current;
            }
            return max;
        }
    }

測試功能

        int arr[] = {6,3,8,2,5,1,7};
        
        // 創建樹
        Tree *tree = malloc(sizeof(Tree));
        tree->root = NULL;
        for(int i=0; i<7; i++) {
            // 樹中插入節點
            insertNode(tree, arr[i]);
        }
    
        // 計算樹的高度
        int treeH = getBSTHeight(tree->root);
        NSLog(@"%d\n", treeH);
        
         // 計算樹的最大值
        int maxNum = getMaxNum(tree->root);
        NSLog(@"%d\n", maxNum);

測試結果

圖片描述

BST樹中序遍歷的得到的是一個有序的數列

源碼地址

鏈接描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章