easy
1.实现二叉树的先序、中序、后序遍历
题目描述:
分别按照二叉树先序,中序和后序打印所有的节点。
输入:{1,2,3}
返回:[[1,2,3],[2,1,3],[2,3,1]]
思路:
建立返回vector,vector的0号元素放在左右子树遍历之前,vector1号元素放在左右子树遍历之间,vector2号元素放在左右子树遍历之后
代码:
class Solution {
public:
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
void threeOrder(TreeNode* root,vector<vector<int>>& vect){
if(!root) return;
vect[0].push_back(root->val);
threeOrder(root->left,vect);
vect[1].push_back(root->val);
threeOrder(root->right,vect);
vect[2].push_back(root->val);
}
vector<vector<int> > threeOrders(TreeNode* root) {
// write code here
vector<vector<int>> vect={{},{},{}};
threeOrder(root, vect);
return vect;
}
};
2.二叉树的层序遍历
题目描述:
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如:
给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [[3],[9,20],[15,7]]
思路:
建立存总结果的vector res和每层结果的vector temp,使用队列,按层遍历,把每层里的点push back到temp里,然后把这一层push back到res里。
代码:
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型vector<vector<>>
*/
vector<vector<int> > levelOrder(TreeNode* root) {
// write code here
vector<vector<int>> res;
queue<TreeNode*> que;
if(root==nullptr) return res;
int height=1;
que.push(root);
while(!que.empty())
{
vector<int> temp;
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
temp.push_back(node->val);
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
height++;
res.push_back(temp);
}
return res;
}
};
3.求二叉树的深度
题目描述:
输入一棵二叉树,求该树的深度。
从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路1:
本质还是层次遍历,用queue遍历每层节点,设置一个变量height记录深度
代码:
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
if(pRoot==nullptr) return 0;
queue<TreeNode*> que;
que.push(pRoot);
int height=0;
while(!que.empty()){
int size=que.size();
for(int i=0;i<size;i++){
TreeNode* node=que.front();
que.pop();
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
height++;
}
return height;
}
};
思路2:
递归遍历左子树和右子树,最后结果取max+1
代码:
class Solution {
public:
int TreeDepth(TreeNode* pRoot) {
if(pRoot==nullptr) return 0;
int left=TreeDepth(pRoot->left);
int right=TreeDepth(pRoot->right);
return max(left,right)+1;
}
};
4.二叉搜索树的第k个节点
题目描述:
给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。
输入:{5,3,7,2,4,6,8},3
返回:{4}
思路:
中序遍历排好序,放进vector里,return第k-1个元素即为第k小的节点
代码:
class Solution {
public:
void InOrder(TreeNode* pRoot,vector<TreeNode*>& vec){
if(pRoot==nullptr) return;
InOrder(pRoot->left, vec);
vec.push_back(pRoot);
InOrder(pRoot->right, vec);
}
TreeNode* KthNode(TreeNode* pRoot, int k) {
if(pRoot==nullptr||k<=0) return nullptr;
vector<TreeNode*> vec;
InOrder(pRoot, vec);//按中序遍历的顺序排序
if(k>vec.size()) return nullptr;
return vec[k-1];//返回第k小的节点
}
};