二叉树(bibary Tree)
二叉树是面试中最容易被问道的问题,这里同样给出高频而且有代表性的10道题目。
二叉树介绍:
定义二叉树:
struct TreeNode {
int data;
TreeNode *left, *right;
TreeNode(){}
TreeNode(int _data, TreeNode* _left, TreeNode* _right):data(_data), left(_left), right(_right){}
};
1. 二叉树的遍历
题目: 给出二叉树的层次遍历, 前序, 中序, 后序 遍历.
扩展: 前序遍历的迭代形式,希望大家自行手写中序和后序的迭代代码, 很多公司会问道非递归代码.
// 前序遍历
void printPostorder(struct TreeNode* node) {
if (node == NULL)
return;
printPostorder(node->left);
printPostorder(node->right);
cout << node->data << " ";
}
// 中序遍历
void printInorder(struct TreeNode* node) {
if (node == NULL)
return;
printInorder(node->left);
cout << node->data << " ";
printInorder(node->right);
}
// 后序遍历
void printPreorder(struct TreeNode* node) {
if (node == NULL)
return;
cout << node->data << " ";
printPreorder(node->left);
printPreorder(node->right);
}
// 层次遍历
void printLevelOrder(struct TreeNode* node) {
queue<TreeNode *> q;
if(!node) q.push(node);
while(!q.empty()) {
// 当前的长度是上一层的个数,这一点很重要,可以解决很多层次遍历相关的问题
int len = q.size();
for(int i = 0; i < len; i ++) {
TreeNode * tmp = q.top();
q.pop();
cout << tmp->data << " ";
if(tmp->left) q.push(tmp->left);
if(tmp->right) q.push(tmp->right);
}
}
}
// 迭代的前序遍历, root left right
void iterativePreorder(struct TreeNode *root) {
if(root == NULL) return;
stack<TreeNode *> sta;
sta.push(root);
while(!sta.empty()) {
// 注意先进后出, 所以先right后left
TreeNode * tmp = sta.top();
sta.pop();
cout << tmp->data << " ";
if(tmp->right) sta.push(tmp->right);
if(tmp->left) sta.push(tmp->left);
}
}
2. 二叉树的Z型遍历
题目: 二叉树的Z型遍历.
扩展: 层次遍历的从下到上遍历, 层次遍历的奇数层遍历, 层次遍历的从右到左遍历等,都可以使用这个代码进行变形
/***
3
/ \
9 20
/ \
15 7
Z型遍历: 3, 20, 9, 15, 7
**/
vector<in