经典面试题——二叉树
#include <cstdio> #include <iostream> #include <queue> using namespace std; struct Node { Node *l, *r; int x; Node(int x=0, Node *l=NULL, Node *r=NULL):x(x),l(l),r(r) {} }; class Tree { public: Tree(Node* root) { this->root = root; } Node* getRoot() { return root; } Node* buildTree() { int x; cin >> x; if(x != -1) { Node* curRoot = new Node(x); curRoot->l = buildTree(); curRoot->r = buildTree(); return curRoot; } else { return NULL; } } void print_pre_order(Node* cur) { if(cur == NULL) return; printf("%d ", cur->x); print_pre_order(cur->l); print_pre_order(cur->r); } void print_in_order(Node* cur) { if(cur == NULL) return; print_in_order(cur->l); printf("%d ", cur->x); print_in_order(cur->r); } void print_post_order(Node* cur) { if(cur == NULL) return; print_post_order(cur->l); print_post_order(cur->r); printf("%d ", cur->x); } void print_level_order(Node* cur) { if(cur==NULL) return; queue<Node*> que; que.push(cur); while(!que.empty()) { Node* c = que.front(); que.pop(); printf("%d ", c->x); if(c->l) que.push(c->l); if(c->r) que.push(c->r); } } int getNodeNum(Node* root) { if(root==NULL) return 0; return getNodeNum(root->l) + getNodeNum(root->r) + 1; } int getLeafNum(Node* root) { if(root==NULL) return 0; if(root->l==NULL && root->r==NULL) return 1; // 是叶子节点 return getLeafNum(root->l) + getLeafNum(root->r); // 非叶子节点 } int getHeight(Node* root) { if(root==NULL) return 0; return max(getHeight(root->l), getHeight(root->r))+1; // 每个节点都加1,所以统计了所有节点数 } void turn_all_node(Node *root) { if(root==NULL) return; if(root->l==NULL && root->r==NULL) return; // 两个分支均为空,交换无意义 // 左右分支交换 Node* temp = root->l; root->l = root->r; root->r = temp; if(root->l) turn_all_node(root->l); if(root->r) turn_all_node(root->r); } bool isExist(Node *root, int x) { if(root == NULL) return 0; if(root->x == x) return 1; return isExist(root->l, x) || isExist(root->r, x); } // 求二叉树第K层的节点个数 int getKnum(Node *root, int k) { if(root==NULL || k < 1) return 0; if(k==1) return 1; return getKnum(root->l, k-1)+getKnum(root->r, k-1); } // 判断两棵二叉树是否结构相同 bool cmp(Node *a, Node *b) { if(a == NULL && b == NULL) return 1; if(a==NULL || b==NULL) return 0; return cmp(a->l, b->l) && cmp(a->r, b->r); } private: Node *root; }; int main () { // 1 2 4 -1 -1 5 -1 6 -1 -1 3 7 -1 8 -1 -1 -1 // 6 4 2 3 -1 -1 -1 -1 5 1 -1 -1 7 -1 -1 Node* root; Tree tree(root); root = tree.buildTree(); // 前、中、后序遍历 tree.print_pre_order(root); printf("\n"); tree.print_in_order(root); printf("\n"); tree.print_post_order(root); printf("\n"); tree.print_level_order(root); printf("\n"); //节点个数 cout << "Node num: " << tree.getNodeNum(root) << endl; // 叶子个数 cout << "Leaf num: " << tree.getLeafNum(root) << endl; // 树高 cout << "Height: " << tree.getHeight(root) << endl; // 二叉树镜像 tree.turn_all_node(root); tree.print_level_order(root); printf("\n"); //子树的节点查找 // int x; // while(cin >> x) { // printf("%s\n", tree.isExist(root, x) ? "Yes!":"No."); // } //求二叉树第K层的节点个数 // int k; // while(cin >> k) { // printf("The %dth floor nodes num: %d\n", k, tree.getKnum(root, k)); // } return 0; }