算法基础知识——二叉树
目录:
- 基础知识
- 基本定义
- 应用实例
- 重建二叉树【剑指Offer_编程题】
- 二叉树的镜像【剑指Offer_编程题】
- 从上往下打印二叉树【剑指Offer_编程题】
- 二叉搜索树的后续遍历序列【剑指Offer_编程题】
- 二叉树中和为某一值的路径【剑指Offer_编程题】
- 二叉树的深度【剑指Offer_编程题】
- 平衡二叉树【剑指Offer_编程题】
- 二叉搜索树与双向链表【剑指Offer_编程题】
- 对称的二叉树【剑指Offer_编程题】
- 二叉树的下一个结点【剑指Offer_编程题】
- 把二叉树打印成多行【剑指Offer_编程题】
- 二叉搜索树的第k个结点【剑指Offer_编程题】
- 按之字形顺序打印二叉树【剑指Offer_编程题】
- 高度最小的BST【程序员面试金典_ 编程题】
- 输出单层结点【程序员面试金典_ 编程题】
一、基础知识
1、基本定义:
- 度:树中一个结点的子结点的个数称为结点的度,树中结点的最大度数称为树的度。
- 有序树和无序树:
- 有序树:树中结点的子树从左到右是有序的,不能交换。
- 无序树:树中结点的子结点位置可以互换。
- 路径:树中两个结点的路径是由这两个结点之间所经过的结点序列构成的。
- 路径长度:路径上所经过的边的个数。
二、应用实例:
1、题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
//write code here
}【剑指Offer_编程题】
- 输入格式:前序遍历序列和中序遍历序列
- 输出格式:重建的二叉树
- 样例输入:无
- 样例输出:无
示例代码:
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin){
if(pre.size() == 0 || vin.size() == 0){
return NULL;
}
vector<int> left_pre, right_pre, left_vin, right_vin;
TreeNode *head = new TreeNode(pre[0]);
int gen = 0;
for(int i = 0; i < vin.size(); i++){
if(vin[i] == head->val){
gen = i;
break;
}
}
for(int i = 0; i < gen; i++){
left_vin.push_back(vin[i]);
left_pre.push_back(pre[i + 1]);
}
for(int i = gen + 1; i < vin.size(); i++){
right_vin.push_back(vin[i]);
right_pre.push_back(pre[i]);
}
head->left = reConstructBinaryTree(left_pre, left_vin);
head->right = reConstructBinaryTree(right_pre, right_vin);
return head;
}
};
2、题目描述:题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
void Mirror(TreeNode *pRoot) {
//write code here
}【剑指Offer_编程题】
- 输入格式:源二叉树
- 输出格式:镜像二叉树
- 样例输入:无
- 样例输出:无
示例代码:
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot == NULL){
return;
}
TreeNode *p = pRoot->right;
pRoot->right = pRoot->left;
pRoot->left = p;
Mirror(pRoot->right);
Mirror(pRoot->left);
}
};
3、题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
vector<int> PrintFromTopToBottom(TreeNode* root) {
//write code here
}【剑指Offer_编程题】
- 输入格式:二叉树根节点指针
- 输出格式:节点列表
- 样例输入:无
- 样例输出:无
示例代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
queue<TreeNode *> myQueue;
vector<int> result;
if(root != NULL){
myQueue.push(root);
}
while(!myQueue.empty()){
TreeNode *current = myQueue.front();
myQueue.pop();
result.push_back(current->val);
if(current->left){
myQueue.push(current->left);
}
if(current->right){
myQueue.push(current->right);
}
}
return result;
}
};
4、题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
bool VerifySquenceOfBST(vector<int> sequence) {
//write code here
}【剑指Offer_编程题】
- 输入格式&#x