#include <bits/stdc++.h> #define null NULL #define maxn 500005 typedef long long ll; using namespace std; typedef struct tree//二叉树的定义 { char data; tree *left; tree *right; }tree,*netree; //创建一个先序二叉树 netree createtree() { char c; cin >> c; netree root; if(c == '#') root = null; else { root = new tree; root -> data = c; root -> left = createtree(); root -> right = createtree(); } return root; } //输出递归先序二叉树 void pretree(netree root) { if(root) { cout << root -> data << " "; pretree(root -> left); pretree(root -> right); } } //输出递归中序二叉树 void midtree(netree root) { if(root) { midtree(root -> left); cout << root -> data << " "; midtree(root -> right); } } //输出递归后序二叉树 void endtree(netree root) { if(root) { endtree(root -> left); endtree(root -> right); cout << root -> data << " "; } } //层次遍历 void every(netree root) { queue<netree> q; if(root) { q.push(root); while(!q.empty()) { netree p; p = q.front(); q.pop(); cout << p -> data << " "; if(p -> left)q.push(p -> left); if(p -> right)q.push(p -> right); } } } void mid_tree(netree root)//非递归中序遍历 { stack<netree>s; while(!s.empty() || root) { if(root) { s.push(root); root = root -> left; } else { netree p; p = s.top(); s.pop(); cout << p -> data << " "; root = p -> right; } } } void leaves(netree root)//叶子的数量 { ll ans = 0; queue<netree> q; if(root) { q.push(root); while(!q.empty()) { netree p; p = q.front(); q.pop(); if(p -> left == null && p -> right == null)ans++; cout << p -> data << " "; if(p -> left)q.push(p -> left); if(p -> right)q.push(p -> right); } } cout << ans << endl; } ll detree(netree root)//树的深度 { if(root == null)return 0; else { ll m = detree(root -> left); ll n = detree(root -> right); if(m > n)return (m + 1); else return (n + 1); } } ll treecount(netree root)//树结点数 { if(root == null)return 0; else return treecount(root -> left) + treecount(root -> right) + 1; } void changetree(netree &root)//交换左右子树 { netree p; if(root) { p = root -> left; root -> left = root -> right; root ->right = p; changetree(root -> left); changetree(root -> right); } } int main() { netree root; cout << "请输入一个先序的二叉树(以#为空)来建立二叉树" << endl; root = createtree(); cout << "二叉树的递归先序遍历是" <<endl; pretree(root); cout << endl; cout << "二叉树的递归中序遍历是" <<endl; midtree(root); cout << endl; cout << "二叉树的递归后序遍历是" <<endl; endtree(root); cout << endl; cout << "二叉树的层次遍历是" <<endl; every(root); cout << endl; cout << "二叉树的非递归中序遍历是" <<endl; mid_tree(root); cout << endl; cout << "叶子的数量" << endl; leaves(root); cout << "树的深度" << endl; cout << detree(root) << endl; cout << "树的结点数" << endl; cout << treecount(root) << endl; cout << "交换左右子树" << endl; changetree(root); cout << "交换成功" << endl; cout << "交换后二叉树的递归先序遍历是" <<endl; pretree(root); cout << endl; cout << "交换后二叉树的递归中序遍历是" <<endl; midtree(root); cout << endl; cout << "交换后二叉树的递归后序遍历是" <<endl; endtree(root); cout << endl; cout << "交换后二叉树的层次遍历是" <<endl; every(root); cout << endl; cout << "交换后二叉树的非递归中序遍历是" <<endl; mid_tree(root); cout << endl; } /* A## ABC#### AB##C## ABCD###EF##G##H## A##B## */