C++二叉树的链表实现
来源:互联网 发布:uv淘宝论坛 编辑:程序博客网 时间:2024/06/12 01:26
包括创建二叉树、递归遍历二叉树、非递归遍历二叉树等操作,请大家注意创建二叉树的函数,注意创建好的输入是怎样的,如下图所示的输入应该为ABC##DE#G##F###,类似于先序遍历。
#include <iostream>#include <stack>using namespace std;typedef struct Node{ char data; struct Node* lchild; struct Node* rchild;}Tree;Tree* createBinTree(){ /*char ch = getchar(); Tree* root; if (ch == '#'){ return NULL; } else{ root = (Tree*)malloc(sizeof(Tree)); if (root == NULL) return NULL; root->data = ch; root->lchild = createBinTree(); root->rchild = createBinTree(); return root; }*/ char ch; Tree* root; if ((ch = getchar()) != '#'){ root = (Tree*)malloc(sizeof(Tree)); if (root == NULL){ return NULL; } root->data = ch; root->lchild=createBinTree(); root->rchild = createBinTree(); } else{ return NULL; } return root;}void createBinTree(Tree* &t){ /*char ch; cin>>ch; if (ch == '#'){ t = NULL; } else{ t = (Tree*)malloc(sizeof(Tree)); t->data = ch; createBinTree(t->lchild); createBinTree(t->rchild); }*/ char ch; if ((ch = getchar()) != '#'){ t = (Tree*)malloc(sizeof(Tree)); t->data = ch; createBinTree(t->lchild); createBinTree(t->rchild); } else{ t = NULL; }}void preOrderTraverse(Tree* &t){ if (t != NULL){ cout << t->data; preOrderTraverse(t->lchild); preOrderTraverse(t->rchild); }}void preOrderTraverseNonRecur(Tree* t){ stack<Tree*> stack; Tree* p = t; while (p != NULL || !stack.empty()){ while (p != NULL){ cout << p->data << " "; stack.push(p); p = p->lchild; } if (!stack.empty()){ p = stack.top(); stack.pop(); p = p->rchild; } }}void inOrderTraverse(Tree* &t){ if (t != NULL){ inOrderTraverse(t->lchild); cout << t->data; inOrderTraverse(t->rchild); } else{ cout << " "; }}void inOrderTraverseNonRecur(Tree* t){ stack<Tree*> stack; Tree* p = t; while (p != NULL || (!stack.empty())){ while (p != NULL){ stack.push(p); p = p->lchild; } if (!stack.empty()){ p = stack.top(); cout << p->data << " "; stack.pop(); p = p->rchild; } }}void postOrderTraverse(Tree* &t){ if (t != NULL){ postOrderTraverse(t->lchild); postOrderTraverse(t->rchild); cout << t->data; } else{ cout << " "; }}void postOrderTraverseNonRecur(Tree* t){ Tree* cur = t; Tree* pre = NULL; stack<Tree*> stack; stack.push(cur); while (!stack.empty()){ cur = stack.top(); if ((cur->lchild == NULL&&cur->rchild == NULL) || (pre != NULL && (cur->lchild==pre||cur->rchild == pre))){ cout << cur->data << " "; stack.pop(); pre = cur; } else{ if (cur->rchild != NULL){ stack.push(cur->rchild); } if (cur->lchild != NULL){ stack.push(cur->lchild); } } }}int main(){ Tree* t = NULL; createBinTree(t); cout << "前序遍历:"; preOrderTraverseNonRecur(t); cout << "\n中序遍历:"; inOrderTraverseNonRecur(t); cout << "\n后序遍历:"; postOrderTraverseNonRecur(t);}
阅读全文
0 0
- 二叉树的二叉链表实现
- 二叉树的二叉链表实现
- 数据结构之---C语言实现二叉树的二叉链表存储表示
- c语言实现二叉树的基本操作--二叉链表存储
- 二叉树 c实现
- 二叉树 C实现
- 二叉树 c 实现
- c语言二叉树和二叉搜索树的实现
- c语言实现的简单二叉树
- 数据结构的C实现_二叉树
- 二叉树的基本功能实现(c++)
- c语言二叉树的实现
- C语言实现二叉树的遍历
- 二叉树的简单C实现
- 哈弗曼二叉树的C简单实现
- 二叉查找树的实现(using C)
- [数据结构]C语言二叉树的实现
- 数据结构 二叉树的实现 c语言版
- 流水作业调度问题
- 简单的通讯录实现方法
- 数据库类型和Java类型之间的关系:
- 深入Hadoop之YARN
- (18)封装简介、private中getter,setter用法
- C++二叉树的链表实现
- GBDT理论知识总结
- java Class 加载过程 符号引用 直接引用
- Java多态——向上转型与向下转型
- java中封装 ,继承与多态
- LeetCode 98 Validate Binary Search Tree(判断二叉搜索树)
- <Linux>AM3358内核移植与根文件系统的制作
- web.xml url-pattern 中/ 和/*的区别
- SPOJ 1043 Can you answer these queries I