1368:對稱二叉樹(tree_c)
阿新 • • 發佈:2021-06-28
【題目描述】
如果二叉樹的左右子樹的結構是對稱的,即兩棵子樹皆為空,或者皆不空,則稱該二叉樹是對稱的。程式設計判斷給定的二叉樹是否對稱.
例:如下圖中的二叉樹T1是對稱的,T2是不對稱的。
二叉樹用順序結構給出,若讀到#則為空,二叉樹T1=ABCDE,T2=ABCD#E,如果二叉樹是對稱的,輸出“Yes”,反之輸出“No”。
【輸入】
二叉樹用順序結構給出,若讀到#則為空。
【輸出】
如果二叉樹是對稱的,輸出“Yes”,反之輸出“No”。
【輸入樣例】
ABCDE
【輸出樣例】
Yes
#include <bits/stdc++.h> using namespace std;struct Node { char value; Node *left, *right; }; Node *CreateTree(const string &s, int i) { if (i < 0 || i >= s.size() || s[i] == '#') { return NULL; } else { // cout << i << endl; Node *root = new Node; root->value = s[i]; root->left = root->right = NULL; root->left = CreateTree(s, i * 2 + 1); root->right = CreateTree(s, i * 2 + 2); return root; } } string PreOrder(Node *root) { string s; if (root != NULL) { s.push_back(root->value); s += PreOrder(root->left); s+= PreOrder(root->right); } return s; } string InOrder(Node *root) { string s; if (root != NULL) { s += InOrder(root->left); s.push_back(root->value); s += InOrder(root->right); } return s; } string PostOrder(Node *root) { string s; if (root != NULL) { s += PostOrder(root->left); s += PostOrder(root->right); s.push_back(root->value); } return s; } bool sym(Node *root) { if (root == NULL) { return true; } else if (!sym(root->left)) { return false; } else if (!sym(root->right)) { return false; } else if (root->left == NULL && root->right == NULL) { return true; } else if (root->left != NULL && root->right != NULL) { return true; } else { return false; } } int main() { // freopen("1.txt", "r", stdin); string s = "ABCDE"; cin >> s; Node *root = CreateTree(s, 0); // cout << PreOrder(root) << endl; // cout << InOrder(root) << endl; // cout << PostOrder(root) << endl; cout << (sym(root) ? "Yes" : "No"); return 0; }