zoukankan      html  css  js  c++  java
  • 两种方法C实现二叉树的创建和遍历

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node {
    	int data;
    	struct node *left;
    	struct node *right;
    } node_t;
    
    typedef struct tree {
    	struct node *root;
    } tree_t;
    
    
    node_t *alloc_one(int data) {
    	node_t *p = (node_t *)malloc(sizeof(node_t));
    	p->data = data;
    	p->left = NULL;
    	p->right = NULL;
    
    	return p;
    }
    
    // 方法1:
    void insert_one(tree_t *t, int data) {
    	node_t *new = alloc_one(data);
    
    	if (t == NULL) {
    		t = new;
    	} else {
    		node_t *tmp = t->root;
    
    		while (tmp) {
    			if (data < tmp->data) {
    				if (tmp->left == NULL) {
    					tmp->left = new;
    					return;
    				} else {
    					tmp = tmp->left;
    				}
    			} else if (data > tmp->data) {
    				if (tmp->right == NULL) {
    					tmp->right = new;
    					return;
    				} else {
    					tmp = tmp->right;
    				}
    			}
    		}
    	}
    }
    
    // 方法2:递归法
    node_t *insert_one2(node_t *t, int data) {
    	node_t *new = alloc_one(data);
    
    	if (t == NULL) {
    		t->root = new;
    	} else {
    		node_t *tmp = t->root;
    
    		if (data < tmp->data) {
    			if (tmp->left == NULL) {
    				tmp->left = new;
    				return tmp->left;
    			} else {
    				insert_one2(tmp->left, data);
    			}
    		} else {
    			if (tmp->right == NULL) {
    				tmp->right = new;
    				return tmp->right;
    			} else {
    				insert_one2(tmp->right, data);
    			}
    		}
    	}
    
    	return t;
    }
    
    
    void inOrder(struct node_t *root, int *res, int *resSize) {
    
    	if (!root) {
    		return;
    	}
    
    	inOrder(root->left, res, resSize);
    	res[(*resSize++)] = root->data;
    	inOrder(root->right, res, resSize);
    }
    
    int* inOrderTraverse(struct node_t *root, int *returnSize) {
    	int *res = malloc(sizeof(int) * 100);
    	*returnSize = 0;
    
    	inOrder(root, res, returnSize);
    }
    
    int main() {
    	int dataList[3] = {3, 5, 19};
    	int i;
    
    	tree_t *my_tree;
    	my_tree->root = NULL;
    
    	for(i = 0; i < sizeof(dataList)/sizeof(int); i++) {
    		insert_one(my_tree, i);
    	}
    
    	return 0;
    }
    
    
    muahao@aliyun.com
  • 相关阅读:
    截取文件路径组成新文件路径
    jsoup选择器
    正则小示例
    一个没有经过优化的过滤指定目录下的指定扩展名文件的算法
    正则表达式生成问题
    链接中带换行的页面查找替换问题
    数组扩容测试
    LeetCode 3.无重复字符的最长子串
    LeetCode 200.岛屿数量
    LeetCode 560.和为K的子数组
  • 原文地址:https://www.cnblogs.com/muahao/p/14639644.html
Copyright © 2011-2022 走看看