1. 程式人生 > 其它 >1368:對稱二叉樹(tree_c)

1368:對稱二叉樹(tree_c)

【題目描述】

如果二叉樹的左右子樹的結構是對稱的,即兩棵子樹皆為空,或者皆不空,則稱該二叉樹是對稱的。程式設計判斷給定的二叉樹是否對稱.

例:如下圖中的二叉樹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; }