二叉树遍历的递归实现和循环迭代法实现(C/C++)

二叉树的遍历(递归实现)
二叉树的遍历(循环迭代实现)
普通树的遍历

准备工作:预处理命令 和 栈操作实现:

#include <stdio.h>
#include <stdlib.h>

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

typedef  char elemtype;
typedef struct tNode * tree;
typedef struct tNode{
    elemtype elem;
    tree left;
    tree right;
}tNode;

//用于遍历的栈结构
typedef struct node{
     elemtype data;
     struct node * next;
}LinkStackNode;

typedef LinkStackNode * LinkStack;



int isEmpty_Stack(LinkStack top)
{
    if (top == NULL)
        return TRUE;
    else
        return FALSE;
}

//栈的Push操作
void Push(LinkStack *top, elemtype x)
{
    LinkStack tmp;
    tmp = (LinkStackNode *)malloc(sizeof(LinkStackNode));
    tmp -> data  = x;
    tmp -> next = *top;
    *top = tmp;


}

// 栈的Pop操作
int Pop(LinkStack *top)
{
    elemtype x;
    if(top == NULL)
        return FALSE;
    LinkStack  tmp;
    tmp = *top;
    //  tmp = top -> next;
    // top -> next = tmp -> next;
    *top = tmp -> next;
    x =  tmp -> data;

    free(tmp);
    return x;
}

前序遍历

void preOrderTrav(tree t)
{
    if(t)  // t -> NULL 即为基线条件
    {
        printf("%c ", t -> elem);
        preOrder(t -> left);
        preOrder(t -> right);
    }
}
void preOrderTrav_2(tree t)
{
    tree T = t;
    LinkStack top;
    while(T || !isEmpty_Stack(top))
    {
        while(T)
        {
            printf("%c ", T -> elem);
            Push(&top, T);
            T = T -> left;
        }
        if(!isEmpty_Stack(top))
        {
            T = Pop(&top);
            T = T ->right;
        }
    }
}

中序遍历

void  inOrderTrav(tree t)
{
    if (t == NULL)
        return;
    inOrder(t -> left);
    printf("%c ",  t -> elem);
    inOrder(t -> right);
}

/*中序遍历非递归遍历算法
1,遇到一个节点,就压栈,并去遍历该节点的左子树;
2,当左子树遍历完后,弹出栈顶的这个树叶节点,并访问(打印一下)
3,进入该节点的右指针继续操作
*/
void inOrderTrav_2(tree t)
{
    tree T = t;
    LinkStack top;
    while(T || !isEmpty_Stack(top))
    {
        while(T)
        {

            Push(&top, T);
            T = T -> left;
        }
        if(!isEmpty_Stack(top))
        {
            T = Pop(&top);
             printf("%c ", T -> elem);
            T = T ->right;
        }
    }
}


后序遍历

void postOrderTrav(tree t)
{
    if(t == NULL);
        return;
    postOrder(t -> left);
    postOrder(t -> right);
    printf("%c", t -> elem);
}

void postOrderTrav_2(tree t)
{
    tree temp = NULL;
    LinkStack top;
    while(t || !isEmpty_Stack(top))
    {
        while(t)
        {
            Push(&top, t);
            t = t -> left;
        }
        if(!isEmpty_Stack(top))
        {
            t = Pop(&top);
            if((t -> right == NULL) || ((t -> right == temp)) )
            {
                //t = t ->right;
                printf("%c ", t -> elem);
                temp = t;
                t = NULL;
            }
            else
            {
                Push(&top, t);
                t = t -> right;
            }
        }
    }
}

C++普通树遍历

#include<iostream>
#include<vector>
#include<queue>
#include<initializeer_list>
using namespace std;

struct Node{
	int data;
	vector<Node*> children;
	
	Node(int x = 0){data = x;}
	void setNode(initializer_list<Node*> il){
		for(Node* x : il)
			children.push_back(x);
	}
}


//先序
void preOrder(Node* root){
	if(root -> NULL) return;
	cout<< root->data << " ";
	for(Node* x : root->child)
		preOrder(x);
}

//后序
void postOrder(Node* root){
	if(root -> NULL) return;
	for(Node* x : root->child)
		postOrder(x);
	cout<< root->data << " ";
}
发布了29 篇原创文章 · 获赞 60 · 访问量 9028

猜你喜欢

转载自blog.csdn.net/a13352912632/article/details/104263116