深度遍历
深度遍历又分为前序,中序,后序。无论是哪一种,左子树的序列、根节点和右子树的序列都是分开的,利用这一点可以递归解决深度遍历
public List<int> InorderTraversal(TreeNode root) {
List<int> a=new List<int>(),b=new List<int>(),c=new List<int>();
if(root==null)
return a;
a.Add(root.val);//前序
if(root.left!=null)
b=InorderTraversal(root.left);
a.AddRange(b);
a.Add(root.val);//中序
if(root.right!=null)
c=InorderTraversal(root.right);
a.AddRange(c);
a.Add(root.val);//后序
return a;
}
层次遍历
层次遍历的需要使用到队列,大致步骤是:根节点入队,出队所有元素记录值并入队他们的子节点,循环直至队空。
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> bfs;
if(root==nullptr)
return bfs;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
vector<TreeNode*> t;
while(!q.empty())
{
t.push_back(q.front());
q.pop();
}
vector<int> cur;
for(int i=0;i<t.size();i++)
{
cur.push_back(t[i]->val);
if(t[i]->left!=nullptr)
q.push(t[i]->left);
if(t[i]->right!=nullptr)
q.push(t[i]->right);
}
bfs.push_back(cur);
}
return bfs;
}