您的位置:首页 > 其它

二叉树的创建与遍历(递归和非递归)

2020-04-24 18:08 106 查看

最近学到了二叉树,把二叉树的实现算法记录下来

#include<iostream>using namespace std;#define maxsize 20typedef char elemtype;class binode {public:elemtype data;binode * right;binode * left;};typedef binode * bitree;//二叉树的创建void creat(bitree &p){elemtype n;cin >> n;if (n == '#')p=nullptr ;else{p = new binode;p->data = n;creat(p->left);creat(p->right);}}// 前序遍历void preorder(binode *T){if (T == nullptr)return;cout << T->data << " ";preorder(T->left);preorder(T->right);}//中序遍历void inorder(binode *T){if (T == nullptr)return;preorder(T->left);cout << T->data << " ";preorder(T->right);}//后序遍历void postorder(binode *T){if (T == nullptr)return;preorder(T->left);preorder(T->right);cout << T->data << " ";}//深度int treeDepth(binode * bt) {if (bt == NULL) {return 0;}int nLeft = treeDepth(bt->left);int nRight = treeDepth(bt->right);return nLeft > nRight ? nLeft + 1 : nRight + 1;}//结点个数int	size(binode* bt){if (bt == NULL)return 0;elsereturn 1 + size(bt->left) + size(bt->right);}//摧毁二叉树void destroy(binode * T){if(T!=NULL){destroy(T->left);destroy(T->right);delete T;}}//前序非递归遍历void preordernonrecursion(binode *bt)//bt 根节点{if (bt != NULL){binode * stack[maxsize];//建一个栈,存放结点的地址int top = -1;binode *p = NULL;	//临时变量,记载出栈的数据stack[++top] = bt;		//入栈while (top != -1){p = stack[top--];	//出栈cout << p->data << " ";//if (p->right != NULL)//先进后出,所以先让右孩子进栈stack[++top] = p->right;if (p->left != NULL)stack[++top] = p->left;}}}//中序非递归遍历void inordernonrecursion(binode *bt)		//bt 根节点{if (bt != NULL){binode *stack[maxsize];int top = -1;binode * p = NULL;p = bt;while (top != -1 || p != NULL)	//加上p!=null,防止每次循环依次出栈到栈空时,p向右走一步,而此时若右孩子不为空,会跳出函数而漏掉右孩子{while (p != NULL)	//树左边路径的结点全部入栈{stack[++top] = p;p = p->left;}if (top != -1){p = stack[top--];	//每次出栈一个cout << p->data << " ";p = p->right;}}}}//后序非递归遍历:前序遍历中交换左右孩子的顺序变成根右左,再通过逆置就变成了左右根,实现后序遍历void postordernonrecursion(binode *bt)//bt 根节点{if (bt != NULL){binode* stack1[maxsize];//存放结点地址binode* stack2[maxsize];//实现逆序int top1=-1,top2 = -1;binode* p=NULL;stack1[++top1] = bt;//入栈while (top1 != -1){p = stack1[top1--];stack2[++top2] = p;if (p->left != NULL)stack1[++top1] = p->left;if (p->right != NULL)stack1[++top1] = p->right;}while (top2 != -1)	//访问stack2,出栈即为后序遍历结果{p = stack2[top2--];cout << p->data << " ";}}}int main(){binode *tree=NULL;creat(tree);//创建cout << "前序遍历为" << endl;preorder(tree);cout << endl;cout << "前序非递归遍历为"<<endl;preordernonrecursion(tree);cout << endl;cout << "中序遍历为" << endl;inorder(tree);cout << endl;cout << "中续非递归遍历为" << endl;inordernonrecursion(tree);cout << endl;cout << "后序遍历为" << endl;postorder(tree);cout << endl;cout <<"后续非递归遍历为"<<endl;postordernonrecursion(tree);cout << endl;cout << treeDepth(tree) << endl;//深度cout << size(tree) << endl; //结点数//destroy(tree);//摧毁//delete tree;return 0;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: