结构体定义
struct TreeNode {
int val;
struct TreeNode *left, *right;
TreeNode(int newVal) {
val = newVal;
left = right = NULL;
}
};
前序遍历:
1、递归写法
void preOrderTraversal(TreeNode *root) {
if (root == NULL)
return;
visit(root);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
2、非递归写法
void preOrderTraversal(TreeNode *root) {
if (root == NULL)
return;
stack<TreeNode *> st;
while (!st.empty() || root) {
if (root) {
visit(root);
st.push(root);
root = root->left;
} else {
root = st.top();
st.pop();
root = root->right;
}
}
}
中序遍历
1、递归写法
void inOrderTraversal(TreeNode *root) {
if (root == NULL)
return;
inOrderTraversal(root->left);
visit(root);
inOrderTraversal(root->right);
}
2、非递归写法
void inOrderTraversal(TreeNode *root) {
if (root == NULL)
return;
stack<TreeNode *> st;
while (!st.empty() || root) {
if (root) {
st.push(root);
root = root->left;
} else {
root = st.top();
st.pop();
visit(root);
root = root->right;
}
}
}
后序遍历:
1、递归写法
void postOrderTraversal(TreeNode *root) {
if (root == NULL)
return;
postOrderTraversal(root->left);
postOrderTraversal(root->right);
visit(root);
}
2、非递归写法
void postOrderTraversal(TreeNode *root) {
if (root == NULL)
return;
stack<TreeNode *> st;
while (!st.empty() || root) {
if (root) {
st.push(root);
root = root->left;
} else {
root = st.top();
st.pop();
if (root->right) {
st.push(root);
} else {
visit(root);
}
root = root->right;
}
}
}
值得一说的是后序遍历:因为当访问到结点P的左结点为空时,此时另需判断P结点右孩子是否为空,若为空,才可visit结点P,否则需要继续遍历其右子树。