zoukankan      html  css  js  c++  java
  • 二叉树基本操作C++

    #include <cstdio>
    #include <climits>
    #include <cassert>
    #include <iostream>
    #include <algorithm>
    #include <string>
    
    struct Node {
      int value = 0;
      struct Node *left = nullptr;
      struct Node *right = nullptr;
    };
    
    void preorder_print_aux(Node *T) {
      if (T == nullptr) {
        return ;
      }
      std::cout << T->value << ' ';
      preorder_print_aux(T->left);
      preorder_print_aux(T->right);
    }
    
    void preorder_print(Node *T) {
      preorder_print_aux(T);
      std::cout << std::endl;
    }
    
    Node *CreateBiTreeAux(Node *&T, std::vector<int>::const_iterator &ite) {
      // 按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
      // 构造二叉链表表示的二叉树T。
      int elem = *ite++;
    
      if (elem == INT_MIN) {
        T = nullptr;
      } else {
        T = new Node;
        T->value = elem;              // 生成根结点
        CreateBiTreeAux(T->left, ite);   // 构造左子树
        CreateBiTreeAux(T->right, ite);   // 构造右子树
      }
      return T;
    }
    
    Node *create_tree(Node *&T, const std::vector<int> &input) {
      std::vector<int>::const_iterator ite = input.begin();
      CreateBiTreeAux(T, ite);
    
      return T;
    }
    
    void free(Node *&T)
    {
      if (T == nullptr)
        return;
    
      free(T->left);
      free(T->right);
      delete T;
      T = nullptr;
    }
    
    int sum(struct Node *tree, int *max_sum) {
      if (tree->left == nullptr && tree->right == nullptr) {
        *max_sum = tree->value;
        return tree->value;
      }
    
      int left_sum = INT_MIN;
      int l_max_sum = INT_MIN;
      if (nullptr != tree->left) {
        left_sum = sum(tree->left, &l_max_sum);
      }
    
      int right_sum = INT_MIN;
      int r_max_sum = INT_MIN;
      if (nullptr != tree->right) {
        right_sum = sum(tree->right, &r_max_sum);
      }
    
      int ret = tree->value + left_sum + right_sum;
      if (ret < l_max_sum) {
        ret = l_max_sum;
      }
      if (ret < r_max_sum) {
        ret = r_max_sum;
      }
    
      *max_sum = ret;
      return ret;
    }
    
    void assert_equal(int expect, std::vector<int> tree) {
      Node *T = nullptr;
      create_tree(T, tree);
      preorder_print(T);
      int ret = 0;
      sum(T, &ret);
      if (expect != ret) {
        fprintf(stderr, "Expect %d, but result is %d.
    ", expect, ret);
        exit(1);
      }
      free(T);
    }
    
    int main() {
      assert_equal(3, {3, INT_MIN, INT_MIN});
      assert_equal(6, {1, 2, INT_MIN, INT_MIN, 3, INT_MIN, INT_MIN});
      assert_equal(2, {5, -8, INT_MIN, INT_MIN, 2, INT_MIN, INT_MIN});
      assert_equal(14, {-5, 10, -6, INT_MIN, INT_MIN, 5, INT_MIN, INT_MIN, 10, INT_MIN, INT_MIN});
      assert_equal(1, {-5, -10, -6, INT_MIN, INT_MIN, 1, INT_MIN, INT_MIN, -10, INT_MIN, INT_MIN});
    
      std::cout << "OK
    ";
    
      return 0;
    }
  • 相关阅读:
    ORA12518 TNS:监听程序无法分发客户机连接的解决办法
    纯css手风琴效果
    css2实现尖角箭头式导航
    html+css基础
    iOS开发之压缩与解压文件
    一种简便的ios图片加密方法对图片进行base64编码
    将自己的应用程序显示在报刊杂志中
    [转]苹果iOS 5限制应用本地存储问题
    [转]苹果开发者帐号(Company)申请流程
    [转]IOS6.0框架及功能更新小结
  • 原文地址:https://www.cnblogs.com/jjtx/p/5851313.html
Copyright © 2011-2022 走看看