二叉树常见面试题
二叉樹結構
struct BinaryTreeNode {int val;BinaryTreeNode *left;BinaryTreeNode *right; };1、二叉樹的深度
int TreeDepth(BinaryTreeNode *root) {if(root == NULL)return 0;int leftDepth = TreeDepth(root->left);int rightDepth = TreeDepth(root->right);return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1); }2、二叉樹的寬度
int TreeWidth(BinaryTreeNode *root) {if(root == NULL)return 0;int maxWidth = 0;queue<BinaryTreeNode*> q;q.push(root);while(true) {int len = q.size();if(len == 0) break;while(len > 0) {BinaryTreeNode *node = q.front();q.pop();len--;if(node->left != NULL)q.push(node->left);if(node->right)q.push(node->right);}maxWidth = q.size() > maxWidth ? q.size() : maxWidth;}return maxWidth; }3、二叉樹的鏡像
void GetMirror(BinaryTreeNode *root) {if(root == NULL)return ;if(root->left == NULL && root->right == NULL)return ;BinaryTreeNode *tmp = root->left;root->left = root->right;root->right = tmp;if(root->left != NULL)GetMirror(root->left);if(root->right != NULL)GetMirror(root->right); }4、判斷二叉樹是否對稱
bool IsSymmetrical(BinaryTreeNode *root) {return IsSymmetrical(root, root); }bool IsSymmetrical(BinaryTreeNode *root1, BinaryTreeNode *root2) {if(root1 == NULL && root2 == NULL)return true;if(root1 == NULL || root2 == NULL)return false;if(root1->val != root2->val)return false;return IsSymmetrical(root1->left, root2->right)&& IsSymmetrical(root1->right, root2->left); }5、判斷二叉樹是否是平衡二叉樹
bool IsBalanced(BinaryTreeNode *root, int *depth) {if(root == NULL) {*depth = 0;return true;}int left, right;if(IsBalanced(root->left, &left) && IsBalanced(root->right, &right)) {int diff = left - right;if(diff >= -1 && diff <= 1) {*depth = (left > right ? left : right) + 1;return true;}}return false; }bool IsBalanced(BinaryTreeNode *root) {int depth = 0;return IsBalanced(root, &depth); }6、不分行從上到下打印二叉樹(所有的值一行輸出)
void PrintFromTopToBottom(BinaryTreeNode *root) {if(root == NULL)return ;queue<BinaryTreeNode *> TreeNode;TreeNode.push(root);while(!TreeNode.empty()) {BinaryTreeNode *node = TreeNode.front();TreeNode.pop();printf("%d ", node->val);if(node->left != NULL)TreeNode.push(node->left);if(node->right != NULL)TreeNode.push(node->right);} }7、分行從上到下打印二叉樹,同一層的節點按從左到右的順序打印,每一層打印到一行。
void PrintEachRowFromTopToBottom(BinaryTreeNode *root) {if(root == NULL)return ;queue<BinaryTreeNode *> TreeNode;TreeNode.push(root);int nextLevel = 0; // 下一層節點的數目int toBePrinted = 1; // 當前層中還沒有打印的節點數while(!TreeNode.empty()) {BinaryTreeNode *node = TreeNode.front();printf("%d ", node->val);if(node->left != NULL) {TreeNode.push(node->left);++nextLevel;}if(node->right != NULL) {TreeNode.push(node->right);++nextLevel;}TreeNode.pop();--toBePrinted;if(toBePrinted == 0) {printf("\n");toBePrinted = nextLevel;nextLevel = 0;}} }8、之字形打印二叉樹:第一層按照從左到右的順序打印,第二層按照從右到左的順序打印,第三層再按照從左到右的順序打印,以此類推。
void PrintZigzagFromTopToBottom(BinaryTreeNode *root) {if(root == NULL)return ;stack<BinaryTreeNode*> levels[2];int current = 0;int next = 1;levels[0].push(root);while(!levels[0].empty() || !levels[1].empty()) {BinaryTreeNode *node = levels[current].top();levels[current].pop();printf("%d ", node->val);if(current == 0) {if(node->left != NULL)levels[next].push(node->left);if(node->right != NULL)levels[next].push(node->right);}else {if(node->right != NULL)levels[next].push(node->right);if(node->left != NULL)levels[next].push(node->left);}if(levels[current].empty()) {printf("\n");current = 1 - current;next = 1 - next;}} }9、二叉搜索樹的第k大節點(中序遍歷)
BinaryTreeNode *KthNode(BinaryTreeNode *root, int k) {if(root == NULL || k == 0)return NULL;return KthNodeCore(root, k); } BinaryTreeNode *KthNodeCore(BinaryTreeNode *root, int &k) {BinaryTreeNode *target = NULL;if(root->left != NULL)target = KthNodeCore(root->left, k);if(target == NULL) {if(k == 1)target = root;k--;}if(target == NULL && root->right != NULL)target = KthNodeCore(root->right, k);return target; }?
總結
- 上一篇: 你的消息队列如何保证消息不丢失,且只被消
- 下一篇: 99%的程序员都在用Lombok,原理竟