输入序列生成二叉树(c++版的)

输入一个序列,生成一个二叉树。
二叉树采用二叉链表形式构造。
要求:
创建一个adtTree,方法有二叉树的生成。
验证是否正确,采取输出二叉树三种遍历顺序。

c++

1个回答

o...................

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
输入序列生成二叉树(c++版的)

输入一个序列,生成一个二叉树。 二叉树采用二叉链表形式构造。 要求: 创建一个adtTree,方法有二叉树的生成。 验证是否正确,采取输出二叉树三种遍历顺序。

怎么先序建立一颗二叉树,输入一个数字比如12,生成12个节点的二叉树,

如题, 怎么先序建立一颗二叉树,输入一个数字比如12,生成12个节点的二叉树,其叶子节点的左右孩子都为-1(空)。

二叉树的创建:根据一串字符串用先序创建二叉树

一串字符串:ABC空格空格DE空格GF空格空格空格 用先序创建二叉树。 ``` #include <stdio.h> #include <stdlib.h> #define maxsize 100 //递归法创建二叉树 //规则:对一串字符串挨个读取遇到空格完成对当前树的创建 typedef struct BimaryTree { char data; struct BimaryTree *Lchild; struct BimaryTree *Rchild; }BiTree; int count = 0;//显示节点的个数 char str[maxsize]; void creatTree(BiTree *&T) { char *ch=str; int i = 0; if (ch[i] == ' ') { T = NULL; } else { if (!(T = (BiTree *)malloc(sizeof(BimaryTree)))) {//问题就在这if内的语句无法执行 各位神我这语句有什么问题吗? T->data = ch[i]; i++; count++; creatTree(T->Lchild); creatTree(T->Rchild); } } return; } int main() { BiTree *T; printf("请输入一串字符串!完成对二叉树的创建!"); scanf("%s", str); creatTree(T); printf("%d", count); system("pause"); return 0; } ```

前序遍历创建二叉树问题

void CreateBiThrTree( BiThrTree *T ) { char c; scanf_s("%c", &c); if (' ' == c) { *T = NULL; } else { *T = (BiThrNode *)malloc(sizeof(BiThrNode)); (*T)->data = c; (*T)->ltag = Link; (*T)->rtag = Link; CreateBiThrTree(&(*T)->lchild); CreateBiThrTree(&(*T)->rchild); } } ``` 如上图,我在创建二叉树时后续迭代时会要求重复输入scanf,但我看别人代码写的时候就不会,请问这是为什么?```

数据结构C语言版二叉树的问题。

**strong text** #include "stdio.h" #include "malloc.h" #include "stdlib.h" #include "conio.h" #define stacksize 100 #define DataType char //便于后期修改。可以直接去修改char 类型来达到快速的修改,在程序长的情况下。 typedef struct node//二叉树的结构体定义 { DataType data; struct node *l; struct node *r; }node,*bitree; typedef struct Node //线索二叉树的结构体定义 { DataType data; int ltag; int rtag; struct Node *l; struct Node *r; }BiTNode,*tree; typedef struct //盏的结构体定义 { DataType zhan[stacksize]; int top; }wode; void initstack(wode *s) //初始化盏 { s->top=-1; } void CreateBiTree(bitree *bt) //二叉树的建立二叉链表方法 //创建的二叉树是不可见的,没成功? { char ch; ch = getchar(); if(ch=='.') bt=NULL; else { *bt=(bitree)malloc(sizeof(bitree)); //生成一个新结点 (*bt)->data=ch; CreateBiTree(&(*(bt))->l); //生成左子树 CreateBiTree(&(*(bt))->r); //生成右子树 } printf("建立完成"); return; } void Visit(char ch)//访问节点 { printf("%c ",ch); } void preorder(bitree root)//以先序的遍历序列来输出二叉树 { if(root!=NULL) { printf("先序输出二叉树"); printf("%c",root->data); preorder(root->l); preorder(root->r); } } void inorder(bitree root)//中序遍历二叉树 { if(root!=NULL) { printf("中序遍历二叉树序列"); inorder(root->l); Visit(root->data); inorder(root->r); } } void postorder(bitree root)//后序遍历二叉树 { if(root!=NULL) { printf("后序遍历二叉树序列"); postorder(root->l); postorder(root->r); Visit(root->data); } } void printfpreorder(bitree root)//二叉树先序输出叶子节点 { printf("二叉树先序输出叶子节点"); if(root!=NULL) { if(root->l==NULL&&root->r==NULL) //判断条件左右子树为空 printf("%c",root->data); printfpreorder(root->l); printfpreorder(root->r); } } void leaf(bitree root) //后序遍历二叉树的叶子节点输出 { printf("后序遍历二叉树的叶子节点输出"); int n; if(root!=NULL) { leaf(root->l); leaf(root->r); if(root->l==NULL&&root->r==NULL) //判断条件 n++; } } int posttreedepth(bitree root)//后序遍历二叉树的深度递归算法 { printf("后序遍历二叉树的深递归算法"); int hl,hr,max; if(root!=NULL) { hl=posttreedepth(root->l); hr=posttreedepth(root->r); max=hl>hr?hl:hr; return(max+1); } else return(0); } int pretreedepth(bitree root,int h) //先序遍历二叉树的深度的递归算法 { printf("先序遍历二叉树深度的递归算法"); int depth; if(root!=NULL) { if(h>depth) depth=h; pretreedepth(root->l,h++); pretreedepth(root->r,h++); } return(depth); } void Inorder(bitree root)//中序遍历的非递归算法 { printf("中序遍历的非递归算法"); int top=0; bitree p; bitree s[stacksize]; int m; m=stacksize-1; p=root; do{ while(p!=NULL) { if(top>m) return; top=top+1; s[top]=p; p=p->l; } if(top!=0) { p=s[top]; top=top-1; Visit(p->data); p=p->r; } } while(p!=NULL||top!=0); } void inthred(tree root) //二叉树的中序线索化 { printf("二叉树的中序线索化"); tree pre; if(root!=NULL) { inthred(root->l); if(root->l==NULL) { root->ltag=1;root->l=pre; } if(pre!=NULL&&pre->r==NULL) { pre->r=root; pre->rtag=1; } pre=root; inthred(root->r); } } BiTNode *inpre(tree p)//中序线索化后找节点的前驱 { printf("中序线索化后找节点的前驱"); tree pre,q; if(p->ltag==1) pre=p->l; else { for(q=p->l;q->rtag==0;q=q->r); pre=q; } return(pre); } BiTNode *innext(tree p)//在中序线索二叉树里找节点的后继 { printf("在中序线索二叉树中找节点的后继"); tree next,q; if(p->ltag==1) next=p->l; else { for(q=p->r;q->ltag==0;q=q->l); next=q; } return(next); } BiTNode *infirst(tree root)//在中序线索二叉树中找第一个节点 { printf("在中序线索二叉树中找第一个节点"); BiTNode *p=root; if(!p) return(NULL); while(p->ltag==0) p=p->l; return p; } void tinorder(tree root)//遍历中序线索二叉树 { printf("遍历中序线索二叉树"); BiTNode *p; p=infirst(p); while (p) { printf("%c ",p->data); p=innext(p); } } void main() { int m; int h=0; bitree bt; tree root; CreateBiTree(&bt); for(;;) { printf("请输入数子来选择你想要的功能\n"); printf("数字为----1-------时 建立二叉树\n"); printf("数字为----2-------时 先序遍历输出二叉树\n"); printf("数字为----3------时 中序遍历二叉树\n"); printf("数字为-----4------时 后序遍历二叉树\n"); printf("数字为------5------时 二叉树先序输出叶子节点\n"); printf("数字为------6-------时 后序遍历二叉树输出节点\n"); printf("数字为-------7------时 后序遍历二叉树的深度\n"); printf("数字为-------8--------时 先序遍历二叉树的深度\n"); printf("数字为------9------时 中序遍历的非递归算法\n"); printf("数字为-----10时 中序遍历线索化\n"); printf("数字为-------11------时 中序遍历线索化后找节点的前驱\n"); printf("数字为------12------时 中序线索化后找后继\n"); printf("数字为-------13------时 中序线索二叉树找第一个节点\n"); printf("数字为------14-----时 遍历中序线索二叉树\n"); printf("\n\n请输入 (1--14) 的数字"); scanf_s("%d",&m); if(m>=2&&m<=14) { switch (m) { case 2:(bt); break; //先序遍历输出二叉树 case 3:inorder(bt); break; //中序遍历二叉树 case 4:postorder(bt); break; case 5:printfpreorder(bt); break; //二叉树先序输出叶子节点 case 6:leaf(bt); break; //后序遍历二叉树输出节点 case 7:posttreedepth(bt); break; //后序遍历二叉树的深度 case 8:pretreedepth(bt,h); break; //先序遍历二叉树的深度 case 9:Inorder(bt); break; //中序遍历的非递归算法 case 10:inthred(root); break; //中序遍历的线索化 case 11:BiTNode *inpre(tree p); break; //中序线索化后找节点的前驱 case 12: *innext(root); break; //中序线索二叉树找后继 case 13:BiTNode *infirst(tree root); break; //中序线索二叉树找第一个节点 case 14:tinorder(root); break; //遍历中序线索二叉树 case 0: exit(0); break; } printf("\n\n操作完毕,请再次选择!"); } else printf("\n\n选择错误,请再次选择!"); } } 这串代码在vs2012 上有错误,但我是一个新手不太明白,求大神解答,谢谢了。

根据前序遍历和中序遍历建立二叉树,并后序遍历输出以及交换左右子树后输出,请修改下面代码

``` #include <stdio.h> #include <malloc.h> #include <string.h> #define maxsize 50 typedef struct Bnode { char data; struct Bnode *Lchild, *Rchild; }BTnode, *BTptr; BTptr CreateBT(char *pre_str, char *in_str) { BTptr bt; bt=(BTptr)malloc(sizeof(BTnode)); bt->data=pre_str[0]; bt->Lchild=NULL; bt->Rchild=NULL; if(strlen(pre_str)==1) return bt; else { char pre_left[maxsize]; char in_left[maxsize]; char pre_right[maxsize]; char in_right[maxsize]; int i=0, j=0; while(in_str[i]!=bt->data) { pre_left[i]=pre_str[i+1]; in_left[i]=in_str[i]; i++; } pre_left[i]='\0'; in_left[i]='\0'; while(i<=strlen(in_str)) { pre_right[j]=pre_str[i]; in_right[j]=in_str[i+1]; i++;j++; } pre_right[j]='\0'; in_right[j]='\0'; if(strlen(pre_left)!=strlen(in_left) || strlen(pre_right)!=strlen(in_right)) { printf("Error\n"); return 0; } bt->Lchild=CreateBT(pre_left, in_left); bt->Rchild=CreateBT(pre_right, in_right); return bt; } } BTptr Judge(char *pre_str, char *in_str) { if(pre_str==NULL || in_str==NULL || strlen(pre_str)!=strlen(in_str)) return 0; else return CreateBT(pre_str, in_str); } void PreExchange(BTptr T) { BTptr p; if(T!=NULL) { p=T->Lchild; T->Lchild=T->Rchild; T->Rchild=p; PreExchange(T->Lchild); PreExchange(T->Rchild); } } void PostOrderBT(BTptr T) { if(T!=NULL) { PostOrderBT(T->Lchild); PostOrderBT(T->Rchild); printf("%c",T->data); } } void main() { char pre_str[maxsize]; char in_str[maxsize]; gets(pre_str); gets(in_str); BTptr bt; bt=Judge(pre_str, in_str); PostOrderBT(bt); printf("\n"); PreExchange(bt); PostOrderBT(bt); } ```

用栈存储指向一个二叉树结点的指针,中序遍历时,进行调试时总卡在GetTop()函数,请大神帮我看看

利用栈存储指向一个二叉树结点的指针,可不知为什么,在进行中序遍历时,进行调试时总卡在GetTop()函数这里,请大神帮我看看 #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int Status; typedef char ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; typedef struct { BiTree *base; BiTree *top; int stacksize; }SqStack; Status InitStack(SqStack &S)//创建一个栈 { S.base=(BiTree *)malloc(sizeof(BiTree)*STACK_INIT_SIZE); if(!S.base) return ERROR; S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } Status Push(SqStack &S,BiTree p) { if((S.top-S.base)>=S.stacksize) { S.base=(BiTree *)malloc((STACKINCREMENT+S.stacksize)*sizeof(BiTree)); if(!S.base) return ERROR; S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=p; return OK; } Status Pop(SqStack &S,BiTree &p) { if(S.base==S.top) return ERROR; p=*--S.top; return OK; } Status StackEmpty(SqStack &S) { if(S.top==S.base) return true; //xprintf("%c",p->data); else return false; } Status GetTop(SqStack S,BiTree &p)//得到栈顶元素,S是一个存放指 //向一个二叉树结点的指针的栈 { BiTree q; if(S.top==S.base) return ERROR; q=*S.top; q->data=3; p=q; //for(int i=0;i<10;i++) printf("dfvsdv"); //p=NULL; printf("%c",p->data); return OK; } Status Visit(ElemType ch) { putchar(ch); return OK; } Status CreateBiTree(BiTree &T){ // 算法6.4 // 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树, // 构造二叉链表表示的二叉树T。 char ch; scanf("%c",&ch); if (ch=='#') T = NULL; else{ if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR; T->data=ch;// 生成根结点 CreateBiTree(T->lchild);// 构造左子树 CreateBiTree(T->rchild);// 构造右子树 } return OK; } // CreateBiTree Status PrintElement(ElemType e) { // 输出元素e的值 printf("%c", e ); return OK; }// PrintElement Status PreOrderTraverse(BiTree T, Status(*Visit)(ElemType)) { if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK; } // PreOrderTraverse Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ){ SqStack S; BiTree p; InitStack(S); Push(S,p); //printf("%c",p->data); while(!StackEmpty(S)) { while(GetTop(S,p)&&p) Push(S,p->lchild); Pop(S,p); if(!StackEmpty(S)) { Pop(S,p); //printf("fdffdf"); if(!Visit(p->data)) return ERROR; Push(S,p->rchild); } } return OK; } // InOrderTraverse Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) { // 后序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。 //补全代码,可用多个语句 if(T==NULL) return OK; PostOrderTraverse(T->lchild,Visit); PostOrderTraverse(T->rchild,Visit); Visit(T->data); return OK; } // PostOrderTraverse int main() //主函数 { BiTree T; CreateBiTree(T); PreOrderTraverse(T,Visit); printf("\n"); InOrderTraverse(T,Visit); printf("\n"); PostOrderTraverse(T,Visit); return 0; //补充代码 }//main ![图片说明](https://img-ask.csdn.net/upload/201604/26/1461662072_473381.png)

二叉树,哈夫曼问题,求大神指点,多谢。

1、已知一棵二叉树的前序遍历为:ABCDEFHIKLGJ,中序遍历序列为:CBAFEIHLKDGJ,画出次二叉树的逻辑结构图。 2、已知一段电文仅含8个字符{C1,C2,……,C8},且每个字符在电文中出现的频率构成权集{13,2,11,20,9,23,17,5},求各个字符的哈夫曼编码

C语言,程序结构 程序不能正常运行

#include <stdio.h> #include <stdlib.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; int found; BinTNode *p; /*****************建立二叉树*****************/ Status CreateBiTree(BinTree &bt) //1.按照先序遍历次序递建立二叉树 { char ch; printf("ch="); scanf("%c",&ch); getchar(); if (ch==' ') bt=NULL; //程序中直接输入空格停止 else { bt=(BinTNode *)malloc(sizeof(BinTNode)); bt->data=ch; //生成根结点 printf("请输入左子树:\n"); CreateBiTree(bt->lchild); printf("请输入右子树:\n"); //构造左子树 CreateBiTree(bt->rchild); //构造右子树 } return OK; } /*****************中序遍历二叉树*****************/ Status Inorder(BinTree bt) //中序遍历算法 { BinTNode *stack[num]; //定义栈数组 int top=0; //初始化栈 stack[top]=bt; do { while(NULL!=stack[top]) //扫描根结点及其所有的左结点并入栈 { top=top+1; stack[top]=stack[top-1]->lchild; } top=top-1; //退栈 if(top>=0) //判断栈是否为空 { printf("%c",stack[top]->data); //访问结点 stack[top]=stack[top]->rchild; //扫描右子树 } }while(top>=0); return OK; } /*Status Inorder(BinTree bt) //先序遍历算法 { BinTNode *stack[num]; //定义栈数组 int top=0; //初始化栈 stack[top]=bt; do { while(NULL!=stack[top]) //扫描根结点及其所有的左结点并入栈 { top=top+1; printf("%c",stack[top]->data); stack[top]=stack[top-1]->lchild; } top=top-1; //退栈 if(top>=0) //判断栈是否为空 { printf("%c",stack[top]->data); //访问结点 stack[top]=stack[top]->rchild; //扫描右子树 } }while(top>=0); return OK; } */ /*****************求指定节点路径*****************/ BinTree NodePath(BinTree bt, BinTNode *ch) //3.求二叉树指定结点的路径 { typedef enum{FALSE,TRUE}boolean; BinTNode *stack[num];//定义栈 int i,top,tag[num]; boolean find;//定义布尔类型变量 BinTNode *s; find=FALSE;//初始化 top=0; s=bt; do {while(s!=NULL) { top++; stack[top]=s; tag[top]=0; s=s->lchild; } if(top>0) {s=stack[top]; if(tag[top]==1) { if(s==ch) {for(i=1;i<=top;i++) printf("->%c",stack[i]->data); find=TRUE; }else top--; s=stack[top]; } if(top>0&&!find) { if(tag[top]!=1) { s=s->rchild;//扫描右子树 tag[top]=1; } else s=NULL; } } }while(!find&&top!=0); return s; } void FindBT(BinTree bt,DataType x) { if((bt!=NULL)&&!found) { if(bt->data==x) { p=bt; found=1; } else { FindBT(bt->lchild,x); FindBT(bt->rchild,x); } } } BinTNode *Findx(BinTree bt,DataType x) { int found=0; BinTree p=NULL; FindBT(bt,x); return(p); } /*****************求二叉树的深度*****************/ int Depth(BinTree bt) //4.求二叉树的深度 { int h,lh,rh; if (bt==NULL) h=0; else { lh=Depth(bt->lchild); rh=Depth(bt->rchild); if (lh>=rh) h=lh+1; else h=rh+1; } return h; } /*****************求叶子节点的个数*****************/ int Leaf(BinTree bt) //5.求二叉树的叶子结点个数 { if (bt==NULL) return 0; else if (bt->lchild==NULL&&bt->rchild==NULL) return OK; else return Leaf(bt->lchild)+Leaf(bt->rchild); } /*****************调换左右子树*****************/ BinTNode *huhuan(BinTNode *p)//6.将p指针指向的二叉树的左右子树进行互换 {BinTNode *stack[num];//指针类型的堆栈 int k=0; stack[k]=NULL; if(p!=NULL)//交换p结点的左右孩子 { k++; stack[k]=p->lchild; p->lchild=p->rchild; p->rchild=stack[k]; p->lchild=huhuan(p->lchild); p->rchild=huhuan(p->rchild); } return (p); } /*****************主函数*****************/ void main() { BinTree bt; char ch1; int xz=1,sd=0,yz=0; while(xz) { printf(" 建立二叉树并求指定结点路径 \n"); printf("============================\n"); printf(" 1.建立二叉树的存储结构 \n"); printf(" 2.求解二叉树的中序遍历 \n"); printf(" 3.求二叉树指定结点的路径 \n"); printf(" 4.求二叉树的深度 \n"); printf(" 5.求二叉树的叶子结点个数 \n"); printf(" 6.将二叉树左右子树交换 \n"); printf(" 0.退出系统 \n"); printf("============================\n"); printf(" 请选择:(0-6) \n"); scanf("%d",&xz); getchar(); switch(xz) { case 1: printf("请输入根节点:\n"); CreateBiTree(bt); printf( "二叉树的链式存储结构建立完成!\n"); break; case 2:printf("该二叉树的中序遍历序列是:\n"); Inorder(bt); printf( "\n"); break; case 3:printf( "请输入要求路径的结点值:\n" ); ch1=getchar(); p=NULL; found=0; Findx(bt,ch1); if(p!=NULL) NodePath(bt,p); else printf( "没有要求的节点! \n" ); printf( "\n" ); break; case 4:sd=Depth(bt); printf( "该二叉树的深度为:%d \n ",sd ); printf("\n"); break; case 5:yz=Leaf(bt); printf( "该二叉树的叶子节点数为:\n%d \n",yz ); printf( "\n" ); break; case 6: bt=huhuan(bt); printf( "该二叉树的左右结点已交换成功,其中序遍历序列是:\n" ); Inorder(bt); printf( "\n" ); break; } } }

数据结构相关问题,一直没有找到错误。代码哪里出错了呢?

■问题描述: 建立一棵二叉树,编程实现从根结点到给定结点之间的路径。 ■基本要求: 建立一棵以二叉链表存储的二叉树,以bt指向根节点、 p指向任一给定结点, 编程实现“以字符形式输出从根结点到给定结点之间的路径”。 ■测试数据: 自行建立一棵以序列{A, B, C, D, E, F, G, H, I, J}中的英文字母为结点 的任意一棵二叉树。 ■实现提示: (1)以某种遍历方式建立二叉树的二叉链表存储结构; (2)以非递归的后序方式遍历二叉树bt,并将访问过的结点依次存储到一个 顺序栈S中; (3)当后序遍历访问到结点*p时,此时栈S中存放的所有结点均为给定结点*p 的祖先,而由这些祖先,便构成了一条从根结点到结点*p之间的路径。 错误提示 :[Error] expected ';', ',' or ')' before '&' token 代码如下: #include <stdio.h> #include <stdlib.h> #define MAXLEN 100 typedef struct BiTNode // 定义二叉树结点结构 { char data; // 数据域 struct BiTNode *LChild,*RChild; // 左右孩子指针域 }BiTNode,*BiTree; int found=0; BiTree p=NULL; //临时结点 //1.建立二叉树 void CreateBiTree(BiTree &bt) {//按照先序序列建立二叉树的二叉链表 char ch; printf("请输入结点:\n"); scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(BiTNode*)malloc(sizeof(BiTNode));//生成一个新结点 bt->data=ch; //生成根结点 CreateBiTree(bt->LChild); //生成左子树 CreateBiTree(bt->RChild); //生成子树 } } //2.后序遍历使结点入栈并求结点路径 void NodePath(BiTree bt,BiTNode*ch) { BiTNode*stack[MAXLEN]; //定义栈 int tag[MAXLEN]; // int i,top=0,find=0; BiTNode *s=bt; //临时指针 do{ while(s!=NULL) { //扫描左子树 top++; stack[top]=s; tag[top]=0; s=s->LChild; } if(top>0) { //栈非空 s=stack[top]; if(tag[top]==1) { if(s==ch) {//遇到给定结点输出路径 for(i=1;i<=top;i++) printf("-%c",stack[i]->data); find=1; } else top--; s=stack[top]; } if(top>0&&!find) { if(tag[top]!=1) {//扫描右子树 s=s->RChild; tag[top]=1; } else s=NULL; } } } while(!find&&top!=0); } BiTNode *FindBT(BiTree bt,char x) { if((bt!=NULL)&&!found) { if(bt->data==x) { p=bt; found=1; } else { FindBT(bt->LChild,x);//遍历查找左子树 遍历查找左子树 FindBT(bt->RChild,x);//遍历查找右子树 遍历查找右子树 } } return(p); } int main() {//主程序界面函数 BiTree bt; char s; system("color 1f"); system("mode con:cols=78 lines=35"); printf("\t 求二叉树上给定结点的路径\n"); printf("\n***********************************************\n"); printf("\t 1.建立二叉树\n"); printf("\t 2.求结点路径\n"); printf("\t 3.退出系统\n"); printf("\t 欢迎使用系统!\n"); printf("\n***********************************************\n"); printf("请选择您想要的服务:"); scanf("%s",&s); switch(s) { case '1': printf("请输入二叉树的结点序列 \n"); CreateBiTree(bt); printf("二叉树建立成功\n"); break; case '2': printf("输入求路径的结点:"); s=getchar(); p=NULL; found=0; FindBT(bt,s); if(p!=NULL) { NodePath(bt,p); printf("\n"); } else printf("没有该结点! \n"); break; case '3':exit(0); default:printf("输入有误");break; } return 0; }

c++实现哈夫曼编码和译码系统

在数据通讯中,经常要将传送的文字转换为二进制字符0和1组成的二进制串,称这个过程为编码。与子相对的是解码或是译码,就是用与编码相同的方式将二进制串转换称编码前的文字的过程称作解码。 要求: 设计一个菜单可以循环显示 B——建树:读入字符集和各字符频度,建立哈夫曼树。 T——遍历:先序和中序遍历二叉树。 E——生成编码:产生每个字符的哈夫曼编码。 C——编码:输入由字符集中字符组成的任意字符串,利用已经生成的哈夫曼编码进行编码,显示编码结果。 D——译码:利用已建成的哈夫曼树进行译码。 X——退出。 我的代码如下: #include<iostream> #include<string> using namespace std; string s1[10000]; string s[10000]; //结点类型 struct element { double weight; //字符出现的概率为实数 char ch; int lchild, rchild, parent; }; //在HuffTer中找权值最小的两个结点i1和i2 void Select(element huffTree[], int *a, int *b, int n) { int i; double weight = 0; for(i = 0; i < n; i++) { if(huffTree[i].parent != - 1) //如果有父结点的,不进行判断 continue; else { if(weight == 0) { weight = huffTree[i].weight; *a = i; } else { if(huffTree[i].weight < weight) { weight = huffTree[i].weight; *a = i; } } } } weight = 0; for(i = 0; i < n; i++) { if(huffTree[i].parent != -1 || (i == *a)) continue; else { if(weight == 0) { weight = huffTree[i].weight; *b = i; } else { if(huffTree[i].weight < weight) { weight = huffTree[i].weight; *b = i; } } } } int temp; if(huffTree[*a].lchild < huffTree[*b].lchild) { //避免根结点的左右子树混淆 temp = *a; *a = *b; *b = temp; } } //建立霍夫曼树 void HuffmanTree(element huffTree[], int w[], char ch[], int n) { for(int i = 0; i < 2 * n - 1;i++) {//霍夫曼树共有2*n - 1个结点 huffTree[i].parent = -1; //双亲结点 huffTree[i].lchild = -1; //左孩子结点 huffTree[i].rchild = -1; //右孩子结点 } for(int i = 0; i < n; i++) { //构造n棵只含有根结点的二叉树 huffTree[i].weight = w[i]; //给哈夫曼树赋权值 huffTree[i].ch = ch[i]; //需要编码的字符 } for(int k = n; k < 2 * n - 1; k++) {//n-1次合并 int i1 = 0; int i2 = 0; Select(huffTree, &i1, &i2, k); //在HuffTer中找权值最小的两个结点i1和i2 huffTree[i1].parent = k; //将i1和i2合并,则i1和i2的双亲是k huffTree[i2].parent = k; huffTree[k].weight = huffTree[i1].weight + huffTree[i2].weight; huffTree[k].lchild = i1; huffTree[k].rchild = i2; huffTree[k].ch = NULL; } } //霍夫曼编码 void HuffmanCode(element hTree[], int n) { int i, j, k; for(i = 0; i < n; i++) { //在数组HuffTree中前n个元素是叶子结点,需要编码 s[i] = ""; //编码s初始化为空串 j = i; //暂存i,不破坏循环变量 while(hTree[j].parent != -1) {//结点j存在双亲 k = hTree[j].parent; if(j == hTree[k].lchild) {//结点j是其双亲的左孩子 s[i] = s[i] + "0"; } else { //结点j是其双亲的右孩子 s[i] = s[i] + "1"; } j = hTree[j].parent; //将结点j的双亲赋给j } cout << "字符" << hTree[i].ch << "的编码:" << endl; for(int p = s[i].size() - 1; p >= 0; p--) { //将s作为结点i的编码逆序输出 s1[i] += s[i].at(p); } cout << s1[i] << endl; } } int main() { char mark; while(cin >> mark) { if(mark == 'B') { int n; cout << "请输入字符个数:" << endl; cin >> n; char c[n]; int w[n]; element huffTree[2 * n]; cout << "请输入字符以及对应权值:" << endl; for(int i = 0; i < n; i++) { cin >> c[i] >> w[i]; } HuffmanTree(huffTree, w, c, n); // 构造霍夫曼树 while(cin >> mark) { if(mark == 'E') { HuffmanCode(huffTree, n); //生成编码 } if(mark == 'C') { //对输入字符串进行编码 string temp; cout << "请输入编码字符串:" << endl; cin >> temp; cout << "该串霍夫曼编码为:" << endl; for(int i = 0; i < temp.size(); i++) { for(int j = 0; j < n; j++) { if(temp.at(i) == c[j]) { cout << s1[j]; } } } cout << endl; } if(mark == 'D') { string temp1; cout << "请输入译码字符串:" << endl; cin >> temp1; cout << "该串译码为:" << endl; string temp2 = ""; string :: iterator it = temp1.begin(); temp2 += *it; for(;;) { for(int i = 0; i < n; i++) { if(temp2 == s1[i]) { cout << c[i]; temp2 = ""; break; } } it++; if(it == temp1.end()) { break; } else { temp2 += *it; } } cout << endl; } if(mark == 'X') { break; } } break; } else { cout << "请先建树" << endl; } } return 0; } 想请教下如何遍历?

Python中哈夫曼的译码问题

我通过编码,对一个含有一大段字符串的文本得到了一个dict和一段编码完成的01字符串,dict中Keys为字符,value为权,不用树,怎么直接根据dict和01字符串译码回去? 比如 00100110101011011100111010101100111011101111010011110011101010110001000100110110101011001111001111110000000111111000001100000010100111111011110011101010111010101 dict: a:110 C:00100 e:11110 d:01 g:11111 f:0000 h:00101 c:00110 q:1001 s:101 r:00111 w:1110 y:10000 x:0001 z:10001 求解

(C语言)在二叉搜索树的学习时遇到了问题,求大佬帮忙看看

如题,在学习二叉搜索树时想要自己添加一些内容,但是不知道为什么就是会出错,自己感觉好像问题出在创建二叉树的地方,但是不知道怎么改.希望大佬能帮忙看看,如果能配上讲解就更好了,感谢. 下面贴上代码,之后是罗列的一些问题,如果代码中还有问题希望大佬能指点下我,谢谢: 项目总共三个文件,二叉搜索树头文件.h和.c文件,然后一个用于测试的主函数.c (二叉搜索树头文件) BSTree.h ``` #ifndef BSTREE_H #define BSTREE_H typedef int DataType; //二叉排序树节点定义 struct BinSearchTreeNode { DataType data; struct BinSearchTreeNode *leftchild; struct BinSearchTreeNode *rightchild; }; typedef struct BinSearchTreeNode *BSTreeNode; typedef struct BinSearchTreeNode *BinSearchTree; /****************************************************************/ /* BinSearchTree *create() */ /* 功能:创建二叉排序树 */ /* 输入参数:无 */ /* 返回值:二叉排序树 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BinSearchTree create(); /****************************************************************/ /* void InOrder(BinSearchTree ptree) */ /* 功能:中序遍历二叉排序树 */ /* 输入参数ptree:二叉排序树 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void InOrder(BinSearchTree ptree); /****************************************************************/ /* BSTreeNode BSTSearch(BinSearchTree bt, DataType key) */ /* 功能:检索二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要检索的元素 */ /* 返回值:成功返回NULL,失败返回元素插入的父结点位置 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BSTreeNode BSTSearch(BinSearchTree bt, DataType key); /****************************************************************/ /* int BSTInsert(BinSearchTree bt, DataType key) */ /* 功能:在二叉排序树中插入元素key */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要插入的元素 */ /* 返回值:成功插入返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTInsert(BinSearchTree bt, DataType key); /****************************************************************/ /* int BSTgetMax(BinSearchTree *bt) */ /* 功能:查找二叉排序树的最大值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMax(BinSearchTree *bt); /****************************************************************/ /* int BSTgetMin(BinSearchTree *bt) */ /* 功能:查找二叉排序树的最小值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMin(BinSearchTree *bt); /****************************************************************/ /* int BSTDelete1(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法1 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete1(BinSearchTree *bt, DataType key); /****************************************************************/ /* int BSTDelete2(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法2 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete2(BinSearchTree *bt, DataType key); /****************************************************************/ /* void BST_Destory(BinSearchTree bt) */ /* 功能:销毁二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BST_Destory(BinSearchTree bt); #endif // BSTREE_H ``` 对应的c文件 BSTree.c ``` #include <stdio.h> #include <stdlib.h> #include "BSTree.h" /****************************************************************/ /* BinSearchTree create() */ /* 功能:创建二叉排序树,注意这里输入的应该是先序序列,并且保证是一*/ /* 个二叉排序树的先序序列 */ /* 输入参数:无 */ /* 返回值:二叉排序树 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BinSearchTree create() { int ch = 0;//初始化 BinSearchTree bt; scanf_s("%d", &ch); if (ch == -1) { bt = NULL; } else { bt = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode)); bt->data = ch; //递归赋值左子树 bt->leftchild = create(); //递归赋值右子树 bt->rightchild = create(); } //返回根节点 return bt; } /****************************************************************/ /* void InOrder(BinSearchTree ptree) */ /* 功能:中序遍历二叉排序树 */ /* 输入参数ptree:二叉排序树 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void InOrder(BinSearchTree ptree) { if (ptree == NULL) { return; } InOrder(ptree->leftchild); printf("%d", ptree->data); InOrder(ptree->rightchild); } /****************************************************************/ /* BSTreeNode BSTSearch(BinSearchTree bt, DataType key) */ /* 功能:检索二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要检索的元素 */ /* 返回值:成功返回NULL,失败返回元素插入的父结点位置 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ BSTreeNode BSTSearch(BinSearchTree bt, DataType key) { BSTreeNode p, parent; p = bt; parent = p; //记录待插入结点的父结点 while (p) { parent = p; //当查找到时提示,返回NULL if (p->data == key) { printf("Exist this key\n"); return NULL; } //根结点大于要查的结点,进入左分支查找 if (p->data > key) { p = p->leftchild; } //根结点小于要查的结点,进入右分支查找 else { p = p->rightchild; } }//p=NULL,跳出循环 return parent; //查找失败,返回parent }//return NULL和parent是为了便于之后的操作 /****************************************************************/ /* int BSTInsert(BinSearchTree bt, DataType key) */ /* 功能:在二叉排序树中插入元素key */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要插入的元素 */ /* 返回值:成功插入返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTInsert(BinSearchTree bt, DataType key) { BSTreeNode p, temp; temp = BSTSearch(bt, key); //temp保存查找之后的结果 //已存在,返回0 if (temp == NULL) { printf("Exist this key\n"); return 0; } //申请结点的内存空间 p = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode)); //申请失败提示 if (p == NULL) { printf("Alloc Failure!\n"); return 0; } p->data = key; //数据域赋值,左右指针域默认为空 //p->leftchild = NULL; //左子树指针域赋值 //p->rightchild = NULL; //右子树指针域赋值 if (key < temp->data) { temp->leftchild = p; //作为左子树插入 } else { temp->rightchild = p; //作为右子树插入 } return 1; } /****************************************************************/ /* int BSTgetMax(BinSearchTree bt) */ /* 功能:查找二叉排序树的最大值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMax(BinSearchTree *bt) { BSTreeNode temp; temp = bt; if (temp) { while (temp->leftchild) { temp = temp->leftchild; } printf("%d", temp->data); } } /****************************************************************/ /* int BSTgetMin(BinSearchTree bt) */ /* 功能:查找二叉排序树的最小值 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BSTgetMin(BinSearchTree *bt) { BSTreeNode temp; temp = bt; if (temp) { while (temp->rightchild) { temp = temp->rightchild; } printf("%d", temp->data); } } /****************************************************************/ /* int BSTDelete1(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法1 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete1(BinSearchTree *bt, DataType key) { BSTreeNode parent, p, maxpl; p = *bt; parent = NULL; //查找被删除的结点 while (p != NULL) { if (p->data == key) break; //查找到了,跳出循环 if (p->data > key) p = p->leftchild; else p = p->rightchild; }//查询结束 if (p == NULL) { printf("%d not exist\n", key); return 0; } //只有右子树的情况 if (p->leftchild == NULL) { //如果被删除的结点是根结点,那就要修改的是二叉排序树的根 if (parent == NULL) *bt = p->rightchild; //检查是左孩子还是右孩子 else if (parent->leftchild == p) parent->leftchild = p->rightchild; else parent->rightchild = p->rightchild; } //既有左子树也有右子树 if (p->leftchild != NULL) { BSTreeNode parentp; //parentp记录maxpl的父结点 parentp = p; maxpl = p->leftchild; //对称遍历中,右侧的总是大的数 //定位p的左子树中的最大结点maxpl while (maxpl->rightchild != NULL) { parentp = maxpl; maxpl = maxpl->rightchild; } p->data = maxpl->data; //修改p的数据域为maxpl的值 if (parentp == p) //如果maxpl的父结点是p p->leftchild = maxpl->leftchild; //修改p结点的左指针 else parentp->rightchild = maxpl->leftchild; //修改父结点的右指针 p = maxpl; //更新p指针为maxpl结点以便删除 } //释放空间 free(p); return 1; } /****************************************************************/ /* int BSTDelete2(BinSearchTree *bt, DataType key) */ /* 功能:删除二叉排序树中的元素key,方法2 */ /* 输入参数bt:二叉排序树的根 */ /* 输入参数key:要删除的元素 */ /* 返回值:成功删除返回1,否则返回0 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ int BSTDelete2(BinSearchTree *bt, DataType key) { //parent记录p的父结点,maxpl记录p的左子树中的关键码最大结点 BSTreeNode parent, p, maxpl; p = *bt; parent = NULL; //查找被删除的结点 while (p != NULL) { if (p->data == key) break; //查找到了,跳出循环 parent = p; //注意这一句 if (p->data > key) p = p->leftchild; else p = p->rightchild; }//查找结束 if (p == NULL) { printf("%d not exist!\n", key); return 0; } //只有右子树的情况 if (p->leftchild == NULL) { //删除的是根结点,做特殊处理 if (parent == NULL) *bt = p->rightchild; //p是父结点parent的左孩子,则修改父结点的左指针 else if (parent->leftchild == p) parent->leftchild = p->rightchild; else parent->rightchild = p->rightchild; } //以上和方法1几乎完全相同 //有左子树和右子树 if (p->leftchild != NULL) { maxpl = p->leftchild; //定位左子树中的最大结点maxpl while (maxpl->rightchild != NULL) maxpl = maxpl->rightchild; maxpl->rightchild = p->rightchild; if (parent == NULL) *bt = p->leftchild; //p是父结点parent的左孩子,则修改父结点的左指针 else if (parent->leftchild == p) parent->leftchild = p->leftchild; //p是父结点parent的右孩子,则修改父结点的右指针 else parent->rightchild = p->leftchild; } free(p); //释放结点p return 1; } /****************************************************************/ /* void BST_Destory(BinSearchTree *bt) */ /* 功能:递归销毁二叉排序树 */ /* 输入参数bt:二叉排序树的根 */ /* 返回值:无 */ /* 创建日期:2019-5-21 Author:Cyber Kaka */ /****************************************************************/ void BST_Destory(BinSearchTree bt) { if (bt) { BST_Destory(bt->leftchild); BST_Destory(bt->rightchild); free(bt); } } ``` 主函数.c文件 main.c ``` #include <stdio.h> #include <stdlib.h> #include "BSTree.h" //用于测试的二叉树先序序列,-1表示空 //40 10 5 -1 -1 -1 55 45 -1 48 47 -1 -1 52 -1 -1 60 -1 70 -1 -1 void main() { BinSearchTree bt; int n = 0; printf("输入二叉排序树的先序序列:\n"); bt = create(); printf("输入要查找的元素,存在返回1,不存在返回0,插入:"); scanf_s("%d", &n); printf("%d\n", BSTSearch(bt, n)->data); printf("输入要插入的元素,成功插入返回1,否则返回0:"); scanf_s("%d", &n); printf("%d\n", BSTInsert(bt, n)); //printf("二叉排序树的中序遍历序列:\n"); //InOrder(bt); printf("\n第一种删除方法,输入要删除的元素,成功返回1,不成功返回0:"); scanf_s("%d", &n); printf("%d\n", BSTDelete1(&bt, n)); //printf("二叉排序树的中序遍历序列:\n"); //InOrder(bt); printf("\n第二种删除方法,输入要删除的元素,成功返回1,不成功返回0:"); scanf_s("%d", &n); printf("%d\n", BSTDelete2(&bt, n)); //printf("二叉排序树的中序遍历序列:\n"); //InOrder(bt); } ``` **问题:**<br> <br> * [0]生成解决方案的时候有警告,但是我忽略了,因为显示程序生成成功了,感觉这几个警告是最大的问题,第4个问题中我详细列出了这些内容<br> <br> * [1]二叉树的递归创建自己感觉有问题,尤其是内存申请这里<br> <br> <code>bt = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode));</code><br> <br> * [2]中序遍历的内容在搜索到左子树底的时候本应返回上一步时会出现异常,建立断点异常内容如下:<br> 引发了异常: 读取访问权限冲突。<br> **ptree** 是 0xCDCDCDCD。<br> <br> * [3]由于中序遍历有异常,所以我注释掉了所有的相关内容,编译时没什么问题,但是删除结点的函数也会出现类似的异常,异常内容如下:<br> 引发了异常: 读取访问权限冲突。<br> **maxpl** 是 0xCDCDCDCD。<br> <br> <br> * [4]好吧,我就都注释掉了,看看别的代码是不是有问题,重新生成解决方案,熟悉的警告出现了,c语言是速成的结构体这块不是很明了,感觉应该是创建二叉搜索树的代码有问题,或者是结构体创建有问题,以下是警告的内容:<br> */bstree.c(24): warning C4047: “=”:“BinSearchTree”与“BSTreeNode *”的间接级别不同<br> */bstree.c(108): warning C4047: “=”:“BSTreeNode”与“BSTreeNode *”的间接级别不同<br> *\bstree.c(139): warning C4047: “=”:“BSTreeNode”与“BinSearchTree *”的间接级别不同<br> *\bstree.c(160): warning C4047: “=”:“BSTreeNode”与“BinSearchTree *”的间接级别不同<br> <br> 第24行:<br> BinSearchTree create()<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;bt = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode));<br> &nbsp;&nbsp;...<br> }<br> <br> 第108行:<br> int BSTInsert(BinSearchTree bt, DataType key)<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;//申请结点的内存空间<br> &nbsp;&nbsp;&nbsp;&nbsp;p = (BSTreeNode *)malloc(sizeof(struct BinSearchTreeNode));<br> &nbsp;&nbsp;...<br> }<br> <br> 第139行:<br> void BSTgetMax(BinSearchTree *bt)<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;temp = bt;<br> &nbsp;&nbsp;...<br> }<br> <br> 第160行:<br> void BSTgetMin(BinSearchTree *bt)<br> {<br> &nbsp;&nbsp;...<br> &nbsp;&nbsp;&nbsp;&nbsp;temp = bt;<br> &nbsp;&nbsp;...<br> }<br> <br> 以上,求各位大佬指点迷津<br>

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

为什么本科以上学历的人只占中国人口的5%,但感觉遍地都是大学生?

中国大学生占总人口不到5% 2017年,中国整体的本科率仅有5.9%;如果算上研究生,这一比例可以进一步上升到6.5% 为什么在国家统计局推出的这份年鉴中,学历的最高一阶就是到研究生,而没有进一步再统计博士生的数量的。 原因其实并不难理解,相比全国和各省整体人口体量,博士生的占比非常之低,属于绝对意义上的小概率样本。 这一点,我们从上表中的各省研究生占比情况也可以看出端倪。除北京、天津、上海三...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

记录下入职中软一个月(外包华为)

我在年前从上一家公司离职,没想到过年期间疫情爆发,我也被困在家里,在家呆着的日子让人很焦躁,于是我疯狂的投简历,看面试题,希望可以进大公司去看看。 我也有幸面试了我觉得还挺大的公司的(虽然不是bat之类的大厂,但是作为一名二本计算机专业刚毕业的大学生bat那些大厂我连投简历的勇气都没有),最后选择了中软,我知道这是一家外包公司,待遇各方面甚至不如我的上一家公司,但是对我而言这可是外包华为,能...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

6年开发经验女程序员,面试京东Java岗要求薪资28K

写在开头: 上周面试了一位女程序员,上午10::30来我们部门面试,2B哥接待了她.来看看她的简历: 个人简历 个人技能: ● 熟悉spring mvc 、spring、mybatis 等框架 ● 熟悉 redis 、rocketmq、dubbo、zookeeper、netty 、nginx、tomcat、mysql。 ● 阅读过juc 中的线程池、锁的源...

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

97年世界黑客编程大赛冠军作品(大小仅为16KB),惊艳世界的编程巨作

这是世界编程大赛第一名作品(97年Mekka ’97 4K Intro比赛)汇编语言所写。 整个文件只有4095个字节, 大小仅仅为16KB! 不仅实现了3D动画的效果!还有一段震撼人心的背景音乐!!! 内容无法以言语形容,实在太强大! 下面是代码,具体操作看最后! @echo off more +1 %~s0|debug e100 33 f6 bf 0 20 b5 10 f3 a5...

程序员是做全栈工程师好?还是专注一个领域好?

昨天,有位大一的同学私信我,说他要做全栈工程师。 我一听,这不害了孩子么,必须制止啊。 谁知,讲到最后,更确定了他做全栈程序员的梦想。 但凡做全栈工程师的,要么很惨,要么很牛! 但凡很牛的,绝不是一开始就是做全栈的! 全栈工程师听起来好听,但绝没有你想象的那么简单。 今天听我来给你唠,记得帮我点赞哦。 一、全栈工程师的职责 如果你学习编程的目的只是玩玩,那随意,想怎么学怎么学。...

不要再到处使用 === 了

我们知道现在的开发人员都使用 === 来代替 ==,为什么呢?我在网上看到的大多数教程都认为,要预测 JavaScript 强制转换是如何工作这太复杂了,因此建议总是使用===。这些都...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

立即提问
相关内容推荐