L3-010 是否完全二叉搜索树 (30 分)
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO。
输入样例1:
1 2
| 9 38 45 42 24 58 30 67 12 51
|
输出样例1:
1 2
| 38 45 24 58 42 30 12 67 51 YES
|
输入样例2:
1 2
| 8 38 24 12 45 58 67 42 51
|
输出样例2:
1 2
| 38 45 24 58 42 12 67 51 NO
|
一道考察二叉树插入方法例程,层序遍历,判断是否为一棵完全二叉树的综合题。
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| #include<iostream> #include<vector> #include<queue>
using namespace std;
struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
void insertNode(TreeNode* root, int val){ if(root == NULL){ return; } if(root->val < val){ if(root->left == NULL){ TreeNode* now = new TreeNode(val); root->left = now; }else{ insertNode(root->left, val); } }else if(root->val > val){ if(root->right == NULL){ TreeNode* now = new TreeNode(val); root->right = now; }else{ insertNode(root->right, val); } } }
void levelOrder(TreeNode* root){ queue<TreeNode*> q; q.push(root); bool isfirst = true; while(!q.empty()){ TreeNode* node = q.front(); q.pop(); if(isfirst){ cout << node->val; isfirst = false; }else{ cout << " " << node->val; } if(node->left) { q.push(node->left); } if(node->right) { q.push(node->right); } } }
bool isCST(TreeNode* root){ bool leaf = false; queue<TreeNode*> q; q.push(root); while(!q.empty()){ TreeNode* node = q.front(); q.pop(); if(node->right && !node->left) return false; if(leaf && (node->left || node->right)) return false; if(!node->right && !leaf){ leaf = true; } if(node->left) { q.push(node->left); } if(node->right) { q.push(node->right); } } return true; }
void printTree(TreeNode* root){ if(!root) return; printTree(root->left); cout << " " << root->val; printTree(root->right); }
int main(){ int c; cin >> c; int rootval; cin >> rootval; TreeNode* root = new TreeNode(rootval); for(int i = 1; i < c; i++){ int nodeval; cin >> nodeval; insertNode(root, nodeval); } levelOrder(root); cout << endl; if(isCST(root)){ cout << "YES" << endl; }else{ cout << "NO" << endl; } return 0; }
|