二叉树非递归遍历

以下是C++代码:

#include <iostream>
#include <stack>
using namespace std;

struct TreeNode {
    int val;//结点的值 
    TreeNode* left;//左孩子 
    TreeNode* right;//右孩子 
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

void preOrderTraversal(TreeNode* root) {
    // 前序遍历:根 -> 左 -> 右
    if (root == NULL) return;
    stack<TreeNode*> s;
    s.push(root);
    while (!s.empty()) {
        TreeNode* node = s.top();
        s.pop();
        cout << node->val << " "; // 访问当前节点
        if (node->right) s.push(node->right); // 右子节点入栈
        if (node->left) s.push(node->left); // 左子节点入栈
    }
    cout << endl;
}

void inOrderTraversal(TreeNode* root) {
    // 中序遍历:左 -> 根 -> 右
    if (root == NULL) return;
    stack<TreeNode*> s;
    TreeNode* curr = root;
    while (curr != NULL || !s.empty()) {
        while (curr != NULL) {
            s.push(curr);
            curr = curr->left; // 一直向左走
        }
        curr = s.top();
        s.pop();
        cout << curr->val << " "; // 访问当前节点
        curr = curr->right; // 转向右子节点
    }
    cout << endl;
}

void postOrderTraversal(TreeNode* root) {
    // 后序遍历:左 -> 右 -> 根
    if (root == NULL) return;
    stack<TreeNode*> s1, s2;//这里需要两个栈 
    s1.push(root);//还是先把根节点压入栈1 
    while (!s1.empty()) {
        TreeNode* node = s1.top();
        s1.pop();
        s2.push(node);//把s1弹出来的压入s2 
        if (node->left) s1.push(node->left);//如果左右结点不为空就压入s1 
        if (node->right) s1.push(node->right);
    }
    while (!s2.empty()) {
        cout << s2.top()->val << " ";
        s2.pop(); 
    }
    cout << endl;
}

int main() {
    // 构建一棵二叉树
    TreeNode* root = new TreeNode(1);//创建根结点 
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->left->left = new TreeNode(4);
    root->left->right = new TreeNode(5);
    root->right->left = new TreeNode(6);
    root->right->right = new TreeNode(7);
    
    cout << "前序遍历: ";
    preOrderTraversal(root);
    cout << "中序遍历: ";
    inOrderTraversal(root);
    cout << "后序遍历: ";
    postOrderTraversal(root);
    
    // 释放二叉树内存,注意从下往上删,要不然先删了root其他点就游离出去找不到了 
    delete root->left->left;
    delete root->left->right;
    delete root->right->left;
    delete root->right->right;
    delete root->left;
    delete root->right;
    delete root;
    
    return 0;
}

这是运行结果:

再往下就是纯c语言版的代码了,鼠鼠我啊偷懒用AI转换了下,不得不说,是真强大啊!

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

typedef struct TreeNode {
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

typedef struct TreeNode *Position;
typedef struct Stack {
    Position *elements;
    int maxSize;
    int top;
} Stack;

void push(Stack *s, Position element) {
    if (s->top == s->maxSize - 1) {
        printf("栈已满,无法入栈。\n");
        return;
    }
    s->elements[++s->top] = element;
}

Position pop(Stack *s) {
    if (s->top == -1) {
        printf("栈为空,无法出栈。\n");
        return NULL;
    }
    return s->elements[s->top--];
}

int isEmpty(Stack *s) {
    return s->top == -1;
}

Position createNode(int data) {
    Position newNode = (Position)malloc(sizeof(TreeNode));
    if (!newNode) {
        printf("创建节点失败。\n");
        return NULL;
    }
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

void preOrderTraversal(TreeNode *root) {
    if (root == NULL) return;
    Stack s;
    s.elements = (Position *)malloc(sizeof(Position) * 100); // 假设栈的最大容量为100
    s.maxSize = 100;
    s.top = -1;
    push(&s, root);
    while (!isEmpty(&s)) {
        Position current = pop(&s);
        printf("%d ", current->data);
        if (current->right) push(&s, current->right);
        if (current->left) push(&s, current->left);
    }
    free(s.elements);
}

void inOrderTraversal(TreeNode *root) {
    if (root == NULL) return;
    Stack s;
    s.elements = (Position *)malloc(sizeof(Position) * 100); // 假设栈的最大容量为100
    s.maxSize = 100;
    s.top = -1;
    Position current = root;
    while (current != NULL || !isEmpty(&s)) {
        while (current != NULL) {
            push(&s, current);
            current = current->left;
        }
        current = pop(&s);
        printf("%d ", current->data);
        current = current->right;
    }
    free(s.elements);
}

void postOrderTraversal(TreeNode *root) {
    if (root == NULL) return;
    Stack s1, s2;
    s1.elements = (Position *)malloc(sizeof(Position) * 100); // 假设栈的最大容量为100
    s1.maxSize = 100;
    s1.top = -1;
    s2.elements = (Position *)malloc(sizeof(Position) * 100); // 假设栈的最大容量为100
    s2.maxSize = 100;
    s2.top = -1;
    push(&s1, root);
    while (!isEmpty(&s1)) {
        Position current = pop(&s1);
        push(&s2, current);
        if (current->left) push(&s1, current->left);
        if (current->right) push(&s1, current->right);
    }
    while (!isEmpty(&s2)) {
        Position current = pop(&s2);
        printf("%d ", current->data);
    }
    free(s1.elements);
    free(s2.elements);
}

int main() {
    // 构建一棵二叉树
    TreeNode *root = createNode(1);
    root->left = createNode(2);
    root->right = createNode(3);
    root->left->left = createNode(4);
    root->left->right = createNode(5);
    root->right->left = createNode(6);
    root->right->right = createNode(7);
    
    printf("前序遍历: ");
    preOrderTraversal(root);
    printf("\n中序遍历: ");
    inOrderTraversal(root);
    printf("\n后序遍历: ");
    postOrderTraversal(root);
    printf("\n");
    
    // 释放二叉树内存
    free(root->left->left);
    free(root->left->right);
    free(root->right->left);
    free(root->right->right);
    free(root->left);
    free(root->right);
    free(root);
    
    return 0;
}

最后贴上我上一个帖子写的dfs代码,dfs(递归深搜)是真好用啊(doge)(树的图片在我另外一篇文章二叉树遍历里面有,不过各位dalao应该能一眼看出来(膜拜))

//以下是数据结构的二叉树遍历
 
#include<stdio.h>
#include<stdlib.h>
 
typedef struct Node{
	int data;//树节点的值,这里设为int类型 
	struct Node* lchild;
	struct Node* rchild;//定义左孩子,右孩子 
}Node;
 
typedef struct Node* PNode;
 
//下面开始建树
//树的图片我放下面了
PNode head;//搞一个head指针准备指向根节点 ,不过这里头节点好像没用上hh,大伙不用管它 
PNode node[10];
 
void Bulid(){
	head=(PNode)malloc(sizeof(Node));//给头节点空间 
	
	for(int i=0;i<10;i++){
		node[i]=(PNode)malloc(sizeof(Node));//给10个节点空间 
		node[i]->lchild=NULL;
		node[i]->rchild=NULL;//先将每个节点的左右儿子全部置空 
	}
	
	for(int i=0;i<10;i++){
		node[i]->data=i+1;//node[0]->data=1,以此类推 
	}
	
	head->lchild=node[0];//拿head的左儿子去当连接根节点
	head->rchild=NULL;//右儿子置空 
	
	node[0]->lchild=node[1];
	node[0]->rchild=node[2];
	node[1]->lchild=node[3];
	node[1]->rchild=node[4];
	node[3]->lchild=node[5];
	node[2]->lchild=node[6];
	node[2]->rchild=node[7];
	node[6]->lchild=node[8];
	node[8]->lchild=node[9];
	//吧啦吧啦,至此粗鲁建树完成 
}
 
void dfs(PNode t){
	//递归打印先序遍历
	 if(t!=NULL){
	 	printf("%d ",t->data);//语句的位置决定了打印出来的是什么遍历 ,放这是先序 
	 	dfs(t->lchild);//搜索该节点左子树  
	 	//放这是中序 
	 	dfs(t->rchild);//搜索该节点右子树
		//放这是后序 
	 }
	 else return;
} 
 
int main(){
	Bulid();
	dfs(node[0]);
	return 0;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值