二叉树节点为:
class TreeNode {
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode () {
left == NULL;
right == NULL;
}
TreeNode(int a) {
val = a;
left == NULL;
right == NULL;
}
~TreeNode() {
};
};
二叉树遍历前序遍历:
就是定义一个栈,然后先把头节点放进去,然后依次先放右节点再放左节点,因为是个栈,先进去的后出来,所以先把右边的放进去。
void PerOrder(TreeNode *root) {
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode *temp = st.top();
cout << temp->val << " ";
st.pop();
if (temp->right) {
st.push(temp->right);
}
if (temp->left) {
st.push(temp->left);
}
}
cout << endl;
}
二叉树的中序遍历:
中序遍历是从二叉树的最左边开始遍历,那么也用栈来搞一下。
代码:
要么栈是空的,要么节点已经遍历完,节点遍历完了表示到头了,需要从栈中读,栈到头了,节点没完的话,需要再把节点放进去,这个思路很简单,就是代码前人写的牛皮,看起来简洁。
void midOrder(TreeNode *root) {
stack<TreeNode*> st;
while (!st.empty() || root) {
if (root == nullptr) {
root = st.top();
cout << root->val << " ";
st.pop();
root = root->right;
} else {
st.push(root);
root = root->left;
}
}
cout << endl;
}
后序遍历:
后序遍历就跟前序没啥区别,就是另外再开辟一个栈空间,把前序遍历存进来,到时候再输出出去,就ok了。
void endOrder(TreeNode *node) {
stack<TreeNode *> st;
stack<TreeNode *> et;
st.push(node);
while (!st.empty()) {
TreeNode *temp = st.top();
et.push(temp);
st.pop();
if (temp->right) {
st.push(temp->left);
}
if (temp->left) {
st.push(temp->right);
}
}
while (!et.empty()) {
cout << et.top()->val << " ";
et.pop();
}
cout << endl;
}
层次遍历方法:
层次遍历方法就是用队列去实现,如果节点有效,就把他左右节点按照顺序放入队列当中即可,然后再一个一个往出读。
void bfsOrder(TreeNode *root) {
queue<TreeNode*> qt;
qt.push(root);
while (!qt.empty()) {
TreeNode *temp = qt.front();
cout << temp->val << " ";
qt.pop();
if (temp->left) {
qt.push(temp->left);
}
if (temp->right) {
qt.push(temp->right);
}
}
cout << endl;
}
测试函数:
#include <iostream>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
int main() {
TreeNode *root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
cout << "前序遍历:";
PerOrder(root);
cout << "中序遍历:";
midOrder(root);
cout << "后序遍历: ";
endOrder(root);
cout << "层次遍历: ";
bfsOrder(root);
return 0;
}
运行结果: