树的遍历有两个基本的方法:深度优先遍历 和 广度优先遍历 。
首先定义一个二叉树结构体:
typedef struct BTreeNode
{
int value;
BTreeNode *left;
BTreeNode *right;
}BTreeNode, *BTree;
先序遍历(前序遍历) 【根左右】:
以上图为例先序遍历的顺序是:ADCDEFGHK
递归方法:
void PreOrderR(BTree pRoot)
{
if (NULL == pRoot) {
return;
}
printf("%d\n", pRoot->value);
PreOrderR(pRoot->left);
PreOrderR(pRoot->right);
}
非递归~
void PreOrder(BTree pRoot)
{
stack<BTree> s;
BTree p = pRoot;
while (p || !s.empty()) {
if (p != NULL) {
s.push(p);
printf("%d\n", p->value);
p = p->left;
}
else {
p = s.top();
s.pop();
p = p->right;
}
}
}
中序遍历 【左根右】:BDCAEHGKF
递归:
//递归方法
void InOrderR(BTree pRoot)
{
if (pRoot== NULL) {
return;
}
InOrderR(pRoot->left);
printf("%d\n", pRoot->value);
InOrderR(pRoot->right);
}
非递归方法
void InOrder(BTree pRoot)
{
stack<BTree> s;
BTree p = pRoot;
while (p || !s.empty()) {
if (p != NULL) {
s.push(p);
p = p->left;
}
else {
p = s.top();
printf("%d\n", p->value);
s.pop();
p = p->right;
}
}
}
后序遍历【左右根】:DCBHKGFEA
扫描二维码关注公众号,回复:
1471055 查看本文章
递归方法:
void PostOrderR(BTree pRoot)
{
if (pRoot== NULL) {
return;
}
PostOrderR(pRoot->left);
PostOrderR(pRoot->right);
printf("%d\n", pRoot->value);
}
非递归方法:
void postOrder(BTree pRoot)
{
stack<BTree> s;
BTree cur;
BTree pre = NULL;
s.push(pRoot);//根结点入栈
while(!s.empty()) {
cur = s.top();
if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right))) {
//左孩子和右孩子同时为空,或者当前结点的左孩子或右孩子已经遍历过了
cout<<cur->value<<" ";
s.pop();
pre = cur;
}
else {
if(cur->right != NULL) {
s.push(cur->right);
}
if(cur->left != NULL) {
s.push(cur->left);
}
}
}
}
以上,欢迎留言交流~