数据结构算法之二叉树的遍历
//------树结点的结构------------------------
typedef struct Node{
struct Node *left; //左孩子结点指针
struct Node *right; //右孩子结点指针
int val; //结点值
}TreeNode;
先序遍历的递归版本
/**
* 递归方法:先序遍历
* @param root 根节点指针
*/
void postorder(reeNode *root) {
if (root == null) {
return;
}
printf(root->val);
postorder(root->left);
postorder(root->right);
}
中序遍历的递归版本
/**
* 递归方法:中序遍历
* @param root 根节点指针
*/
void postorder(TreeNode *root) {
if (root == null) {
return;
}
postorder(root->left);
printf(root->val);
postorder(root->right);
}
后序遍历的递归版本
/**
* 递归方法:后序遍历
* @param root 根节点指针
*/
void postorder(TreeNode *root) {
if (root == null) {
return;
}
postorder(root->left);
postorder(root->right);
printf(root->val);
}
先序遍历的非递归版本
/**
* 迭代方法:深度优先遍历,相当于先根遍历
* 借助stack
* @param root 根节点指针
*/
void preOrder(TreeNode *root) {
stack<TreeNode*> s;
TreeNode *p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
printf(p->data);
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
s.pop();
p=p->rchild;
}
}
}
中序遍历的非递归版本
/**
* 迭代方法:中序遍历
* 借助于stack
* @param root 根节点
*/
void inOrder(TreeNode *root)
{
stack<TreeNode*> s;
TreeNode*p=root;
while(p!=NULL||!s.empty())
{
while(p!=NULL)
{
s.push(p);
p=p->lchild;
}
if(!s.empty())
{
p=s.top();
cout<<p->data<<" ";
s.pop();
p=p->rchild;
}
}
}
后序遍历的非递归版本
/**
* 迭代方法:后序遍历
* 借助于stack
* @param root 根节点
*/
void postOrder(TreeNode *root){
stack<TreeNode *> s;
TreeNode *cur;
TreeNode *pre=NULL;
s.push(root);
while(!s.empty())
{
cur=s.top();
if((cur->left==NULL&&cur->right==NULL)||
(cur-right==NULL&&pre==cur->left)||cur->right!=NULL&&pre ==cur->right) {
cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过
s.pop();
pre=cur;
}
else{
if(cur->rchild!=NULL)
s.push(cur->rchild);
if(cur->lchild!=NULL)
s.push(cur->lchild);
}
}
}