账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    c++数据结构,二叉树运行不出来
    40
    0
    #include <iostream>#include <stack>using namespace std;template <class ElemType> // 二叉链表结点结构struct BTNode{ ElemType data; BTNode<ElemType> *lchild, *rchild;};//二叉链表类template<class ElemType>class BinaryTree{public: //构造函数 BinaryTree():m_root(NULL){} //按以先序次序输入结点值的方式建立二叉树 void _Create(BTNode<ElemType> * &T,ElemType ch[],const ElemType &c,int &i); //按先序次序输入结点值的方式建立二叉树的接口函数 void Create(ElemType ch[], const ElemType &c); //求叶子结点个数 int _Leaf(BTNode<ElemType> *T); //求叶子结点个数的接口函数 int Leaf() { return _Leaf(m_root); } //求二叉树的深度 int _Depth(BTNode<ElemType>*); //求二叉树的深度的接口函数 int Depth() { return _Depth(m_root); } //先序递归遍历二叉树 void _PreorderTraverse(BTNode<ElemType>*T,void (*visit)(const ElemType &e)); //先序递归遍历二叉树的接口函数 void PreorderTraverse() { _PreorderTraverse(m_root,visit); } //中序递归遍历二叉树 void _InorderTraverse(BTNode<ElemType>*T); //中序递归遍历二叉树的接口函数 void InorderTraverse() { _InorderTraverse(m_root); } //后序递归遍历二叉树 void _PostorderTraverse(BTNode<ElemType>*T); //后序递归遍历二叉树的接口函数 void PostorderTraverse () { _PostorderTraverse(m_root); } //先序非递归遍历二叉树 void PreorderTraverseNonRecursive(); //计算二叉树中结点值为奇数的结点个数 int _CountOdd(BTNode<ElemType> *T); //计算二叉树中结点值为奇数的结点个数的接口函数 int CountOdd() { int NumOdd=_CountOdd(m_root); return NumOdd; } //以广义表形式输出二叉树 void _Print(BTNode<ElemType> *T); //以广义表形式输出二叉树的接口函数 void Print() { _Print(m_root); }private: BTNode<ElemType> *m_root; };//按先序次序输入结点值的方式建立二叉树template <class ElemType>void BinaryTree<ElemType>:: _Create(BTNode<ElemType> * &T,ElemType ch[],const ElemType &c,int &i){ if(ch[i]==c) T=NULL; else{ T=new BTNode<ElemType>; T->data=ch[i]; _Create(T->lchild,ch,c,++i); _Create(T->rchild,ch,c,++i); }}//按先序次序输出结点值的方式建立二叉树的接口函数template<class ElemType>void BinaryTree<ElemType>::Create(ElemType ch[],const ElemType &c){ int i=0; _Create(m_root,ch,c,i);}//求二叉树的深度template <class ElemType>int BinaryTree<ElemType>::_Depth(BTNode<ElemType>* T){if(!T)return 0;int h1,h2;h1=_Depth(T->lchild);h2=_Depth(T->rchild);return h1>h2?h1+1:h2+1;}//先序递归遍历二叉树template <class ElemType>void BinaryTree<ElemType>::_PreorderTraverse(BTNode<ElemType>*T,void(*visit)(const ElemType &e)){ if(T){ visit(T->data); _PreorderTraverse(T->lchild,visit); _PreorderTraverse(T->rchild,visit); }}//中序递归遍历二叉树template <class ElemType>void BinaryTree<ElemType>::_InorderTraverse(BTNode<ElemType>*T,void (*visit)(const ElemType &e)){ if(T){ _InorderTraverse(T->lchild,visit); visit(T->data); _InorderTraverse(T->rchild,visit); }}//后序递归遍历二叉树template <class ElemType>void BinaryTree<ElemType>::_PostorderTraverse(BTNode<ElemType>*T){ if(T){ _PostorderTraverse(T->lchild,visit); -PostorderTraverse(T->rchild,visit); visit(T->data); }}//先序遍历的非递归遍历二叉树template<class ElemType>void BinaryTree<ElemType>::PreorderTraverseNonRecursive(){stack<BTNode<ElemType> *> S;BTNode<ElemType> *p;S.push (m_root);while (!S.empty ()) {p = S.top ();while (p) {visit(p->data);p = p->lchild;S.push(p); // 向左走到尽头}S.pop(); // 空指针退栈if (!S.empty()){p = S.top ();S.pop();S.push(p->rchild);}}}//求二叉树叶子结点个数template<class ElemType>int BinaryTree<ElemType>::_Leaf(BTNode<ElemType> *T){ if(T==NULL) return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else return _Leaf(T->lchild)+_Leaf(T->rchild);}//计算二叉树中结点值(如果是字符,则应为字符ASCII码值)为奇数的结点个数template<class ElemType>int BinaryTree<ElemType>::_CountOdd(BTNode<ElemType> *T){ static int a=1; if(T==NULL) return 0; else{ if(T->data%2!=0){ a++; _CountOdd(T->lchild); _CountOdd(T->rchild); } } return a;}//以广义表形式输出二叉树template <class ElemType> void BinaryTree<ElemType>::_Print(BTNode<ElemType> *T){ if(T) { cout<<T->data; if(T->lchild!=NULL||T->rchild!=NULL) { cout<<"("; _Print(T->lchild); if(T->rchild!=NULL) cout<<","; _Print(T->rchild); cout<<")"; } }}//主函数int main(){ BinaryTree<char>b; char ch[50],c; cout<<"请输入序列"<<endl; cin>>ch; cout<<"请输入特殊字符"<<endl; cin>>c; b.Create(ch,c); cout<<"建立的二叉树为 "<<endl; b.Print(); cout<<"奇结点个数"<<b.CountOdd()<<endl; b.PreorderTraverse(); cout<<"先序非递归"<<endl; b.Print(); cout<<"叶子结点个数"<<b.Leaf<<endl; return 0;}
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 许久未来 普通会员 1楼

      二叉树的数据结构在C++中可以实现,但是需要注意一些问题,比如如何遍历二叉树、如何搜索二叉树等。

      首先,你需要定义一个二叉树节点的结构体,包括一个值和两个指向子节点的指针。例如:

      cpp struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };

      然后,你可以定义一个函数来构建二叉树。这个函数的参数是一个指向二叉树节点的指针,返回一个指向新创建的二叉树节点的指针。例如:

      cpp TreeNode* buildTree(TreeNode* root) { if (root == NULL) { return NULL; } TreeNode* left = buildTree(root->left); TreeNode* right = buildTree(root->right); root->left = right; root->right = left; return root; }

      接下来,你可以定义一些函数来实现二叉树的遍历。这些函数包括前序遍历、中序遍历和后序遍历。例如:

      ```cpp void preOrder(TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); preOrder(root->left); preOrder(root->right); }

      void inOrder(TreeNode* root) { if (root == NULL) { return; } inOrder(root->left); printf("%d ", root->val); inOrder(root->right); }

      void postOrder(TreeNode* root) { if (root == NULL) { return; } postOrder(root->left); postOrder(root->right); printf("%d ", root->val); } ```

      最后,你可以定义一些函数来搜索二叉树。这些函数包括深度优先搜索和广度优先搜索。例如:

      cpp TreeNode* searchTree(TreeNode* root, int val) { if (root == NULL) { return NULL; } if (root->val == val) { return root; } if (val < root->val) { return searchTree(root->left, val); } return searchTree(root->right, val); }

      以上就是一个简单的二叉树的数据结构实现。如果你需要更复杂的功能,比如查找特定的节点、插入节点、删除节点等,你可能需要进一步学习和研究二叉树的数据结构。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部