**
树的遍历(n插树的遍历,二叉树的前中后序非递归实现,以及层次遍历按层级输出)
首先感叹,代码一定要自己去敲,听的课讲的再好也要去敲。
注:所有代码全是力扣上面的。
前序遍历的两种实现(一种可以类推后中序,一种可以退出n插树的遍历方法。)
一.用到栈以及两层while循环
1.前序遍历
void preorder(TreeNode*tree) {
stack<TreeNode*>ss;
while (tree != NULL || !ss.empty()) {
while (tree != NULL) {
cout << tree->val;
ss.push(tree);
tree = tree->left;
}
tree=ss.top();
ss.pop();
tree = tree->right;
}
}//两层while循环
2…中序遍历
与前序的区别(前序是在遍历左孩子时就输出元素,但是中序是在出栈时才输出元素)
vector<string>midorder(TreeNode* root) {
TreeNode* test;
vector<string>vec;
stack<TreeNode*>ss;
while (!ss.empty() || root != NULL) {
while (root != NULL) {
ss.push(root);
root = root->left;
}//将所有左孩子导入栈中
root = ss.top();
ss.pop();
vec.push_back(root->val);
root = root->right;
}
return vec;
}
二.栈加一层while循环
1.前序遍历
void preorder1(TreeNode* tree) {
TreeNode* test;
stack<TreeNode*>s;
s.push(tree);
while (!s.empty()) {
test = s.top();
cout << test->val;
s.pop();
if (test->right != NULL)s.push(test->right);
if (test->left != NULL)s.push(test->left);
}
}
2.遍历n叉树
vector<int> preorder(Node* root) {
stack<Node*>ss1;
vector<int>vec;
ss1.push(root);
while (!ss1.empty()) {
Node* abs = ss1.top();
ss1.pop();
vec.push_back(abs->val);
int size = abs->children.size();
for (int i = size - 1; i >= 0; i--) {
ss1.push(abs->children[i]);
}
}
return vec;
}
三.层次遍历
vector<vector<int>> levelOrder(TreeNode*root){
vector<int>vec1;
vector<vector<int>>vec2;
queue<TreeNode*>q;
TreeNode*test;
q.push(root);
while(!q.empty()){
int size=q.size();
for(int i=0;i<size;i++){
test=q.front();
q.pop();
vec1.push_back(test->val);
if(test->left!=NULL)q.push(test->left);
if(test->right!=NULL)q.push(test->right);
}
vec2.push_back(vec1);
vec1.clear();
}
}
运行后成果