刷提前应该知道的C++\Java二叉树知识
对查找资料的总结
标准库中的二叉树?
SGI STL库中并没有二叉树,可以看StackOverflow上的这个问题。但GNU中的tree.hh
实现了树
刷题时会提供一个TreeNode,通常定义如下
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};
虽然STL库中没有二叉树,但是其中的数据结构set、map、multiset、multimap的底层实现都是平衡二叉搜索树
Java的标准库中竟然有树(…),在javax.swing.JTree;
中
二叉树的名称
- 二叉搜索树与二叉查找树是同一个意思
平衡二叉搜索树
又称AVL,是两个人名字的缩写
二叉树的遍历
使用递归,以中序遍历为例
C++实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void inorder(TreeNode* root, vector<int>& res){
if(root==nullptr) return;
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
inorder(root, res);
return res;
}
};
注意点
- cpp中可以直接
return;
- 因为在递归过程中传递的是向量的引用,因此
inorder
函数设计成void类型 - 遍历过程在inorder函数中,res用于存储遍历元素。记住这个两参函数
Java实现
class Solution {
void inorder(TreeNode root, List<Integer> res){
if(root == null) return;
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
inorder(root, res);
return res;
}
}
注意点:
- Java中
List<Integer>
可以与C++中vector<int>
类比,都可以以索引访问元素,并且可以用add
追加元素(自然也可以从末尾减少长度删除) List是一个抽象类,当作一个容器。
声明列表若写成List<Integer> res = new List<Integer>();
会报错- Java中也可以直接
return;
题目
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/ \
2 7
/ \ / \
1 3 6 9
镜像输出:
4
/ \
7 2
/ \ / \
9 6 3 1
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
来源:力扣(LeetCode)
思路
使用DFS
,过程中交换左右结点即可
题解
C++
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mirrorTree(TreeNode* root) {
if(!root) return NULL;
else swap(root->left, root->right);
mirrorTree(root->left);
mirrorTree(root->right);
return root;
}
};
注意点:
- swap函数也可用于交换非标准库数据类型
- 交换语句写在最后一行return之前也可(为什么?)
Java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root == null) return null;
else {
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
}
mirrorTree(root.left);
mirrorTree(root.right);
return root;
}
}