遞歸算法
void preorder1(Node *root) //遞歸前序遍歷
{
if (root == NULL) return;
printf("%d ", root->val);
preorder1(root->left);
preorder1(root->right);
}
void inorder1(Node *root) //遞歸中序遍歷
{
if (root == NULL) return;
inorder1(root->left);
printf("%d ", root->val);
inorder1(root->right);
}
void postorder1(Node *root) //遞歸後序遍歷
{
if (root == NULL) return;
postorder1(root->left);
postorder1(root->right);
printf("%d ", root->val);
}
棧模擬非遞歸算法。遞歸算法本質上就是利用編譯器實現棧的操作。
void preorder2(Node *root)//非遞歸前序遍歷
{
if (root == NULL) return;
stack<Node *> stk;
stk.push(root);
while (!stk.empty())
{
Node *p = stk.top(); stk.pop();
printf("%d ", p->val);
if (p->right) stk.push(p->right);
if (p->left) stk.push(p->left);
}
}
void postorder2(Node *root)//非遞歸後序遍歷,利用兩個棧
{
if (root == NULL) return;
stack<Node *> stk, stk2;
stk.push(root);
while (!stk.empty())
{
Node *p = stk.top(); stk.pop();
stk2.push(p);
if (p->left) stk.push(p->left);
if (p->right) stk.push(p->right);
}
while(!stk2.empty())
{
printf("%d ", stk2.top()->val);
stk2.pop();
}
}
void inorder2(Node *root)//非遞歸中序遍歷
{
stack<Node *> stk;
Node *p = root;
while (p != NULL || !stk.empty())
{
if (p != NULL)
stk.push(p), p = p->left;
else
{
p = stk.top(); stk.pop();
printf("%d ", p->val);
p = p->right;
}
}
}
層次遍歷,即從上往下遍歷,利用一個隊列。
void uptodown(Node *root)
{
if(root == NULL)
return;
queue<Node *> Q;
Q.push(root)
while(!Q.empty())
{
Node *p = Q.front();
printf("%d ",p->value);
Q.pop();
Q.push(p->left);
Q.push(p->right);
}
}