zoukankan      html  css  js  c++  java
  • C++_学习随笔_重构二叉树和判断是否是对称二叉树

    通过输入二叉树的前序遍历和中序遍历重构二叉树,

    然后对二叉树进行是否是对称二叉树的判断。

     1 #include<iostream>
     2 #include<vector>
     3 using namespace std;
     4 
     5 struct TreeNode {
     6     int val;
     7     TreeNode* left;
     8     TreeNode* right;
     9     TreeNode(int x):val(x),left(NULL),right(NULL){}
    10 };
    11 
    12 //根据前序遍历和中序遍历重构二叉树
    13 TreeNode* reConstructBinaryTree(vector<int>pre, vector<int>vin) {
    14     if (pre.empty() || vin.empty())
    15         return nullptr;
    16     //根节点
    17     TreeNode *root = new TreeNode(pre[0]);
    18     int root_index = 0;
    19     //找到根节点的索引值
    20     for (int i = 0; i < pre.size(); i++) {
    21         if (vin[i] == pre[0]) {
    22             root_index = i;
    23             break;
    24         }
    25     }
    26     vector<int> pre_left, pre_right, vin_left, vin_right;
    27     for (int i = 0; i < root_index; i++) {
    28         pre_left.push_back(pre[i + 1]);
    29         vin_left.push_back(vin[i]);
    30     }
    31 
    32     for (int i = root_index + 1; i < pre.size(); i++) {
    33         pre_right.push_back(pre[i]);
    34         vin_right.push_back(vin[i]);
    35     }
    36 
    37     root->left = reConstructBinaryTree(pre_left, vin_left);
    38     root->right = reConstructBinaryTree(pre_right, vin_right);
    39 
    40     return root;
    41 }
    42 
    43 
    44 //判断是否是对称的
    45 bool isSymmetrical(TreeNode* p1, TreeNode* p2) {
    46     if (p1 == NULL && p2 == NULL)
    47         return true;
    48     if (p1 == NULL || p2 == NULL)
    49         return false;
    50     if (p1->val != p2->val)
    51         return false;
    52     return isSymmetrical(p1->left, p2->right) && isSymmetrical(p1->right, p2->left);
    53 }
    54 
    55 
    56 bool isSymmetrical(TreeNode* pRoot) {
    57     if (pRoot == NULL) {
    58         return true;
    59     }
    60     return isSymmetrical(pRoot, pRoot);
    61 }
    62 
    63 
    64 int main() {
    65     vector<int> pre, vin;
    66     cout << "请输入节点数:"<<endl;
    67     int n = 0,temp;
    68     cin >> n;
    69     cout << "请输入前序遍历:" << endl;
    70     for (int i = 0; i < n; i++) {
    71         cin >> temp;
    72         pre.push_back(temp);
    73     }
    74     cout << "请输入中序遍历:" << endl;
    75     for (int i = 0; i < n; i++) {
    76         cin >> temp;
    77         vin.push_back(temp);
    78     }
    79     bool is;
    80     TreeNode* root_node = reConstructBinaryTree(pre, vin);
    81     is = isSymmetrical(root_node);
    82     cout << is;
    83     
    84 }

            8

        6        6

    5      7  7        5

     

              8

          6        9

      5      7  7      5

     

    参考链接:

    https://www.cnblogs.com/wanglei5205/p/8503036.html

    https://cuijiahua.com/blog/2018/01/basis_58.html

  • 相关阅读:
    云中树莓派(5):利用 AWS IoT Greengrass 进行 IoT 边缘计算
    乐观锁 与 悲观锁 来解决数据库并发问题
    Python二维数组构造
    一次问题追查----短字符串签名算法引发的bug
    C++ assert 断言使用
    并查集(Union-Find)算法
    linux shell grep/awk/sed 匹配tab
    C++ 变量默认初始值不确定(代码测试)
    linux 查看机器内存方法 (free命令)
    html table奇偶行颜色设置 (CSS选择器)
  • 原文地址:https://www.cnblogs.com/reluctante1/p/12747280.html
Copyright © 2011-2022 走看看