开发工具与编程

开发工具与编程技巧集锦

优秀的开发者不仅要掌握语言本身,更要熟悉各种开发工具和编程技巧。本文汇集了多种语言的实用技巧和工具,帮助你提升开发效率和代码质量。 JavaScript实用技巧 数组操作 基本排序 // 数字数组排序(从小到大) function compare(num1, num2) { return num1 - num2; } var nums = [3, 1, 2, 100, 4, 200]; nums.sort(compare); console.log(nums); // [1, 2, 3, 4, 100, 200] // 从大到小排序 function compareDesc(num1, num2) { return num2 - num1; } nums.sort(compareDesc); console.log(nums); // [200, 100, 4, 3, 2, 1] 注意:JavaScript的sort()方法默认将元素转换为字符串排序,所以对数字需要自定义比较函数。 迭代器方法 // map:创建新数组 function first(word) { return word[0]; } var words = ["for", "your", "info"]; var acronym = words.map(first); console.log(acronym.join("")); // "fyi" // 数值计算 var numbers = [1, 2, 3, 4, 5]; var doubled = numbers.map(x => x * 2); console.log(doubled); // [2, 4, 6, 8, 10] filter过滤 // 筛选及格成绩 function passing(num) { return num >= 60; } var grades = []; for (var i = 0; i < 20; i++) { grades[i] = Math.floor(Math.random() * 101); } var passGrades = grades.filter(passing); console.log("全部成绩:", grades); console.log("及格成绩:", passGrades); // 筛选偶数 var nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var evens = nums.filter(n => n % 2 === 0); console.log(evens); // [2, 4, 6, 8, 10] reduce累加 // 数组求和 var numbers = [1, 2, 3, 4, 5]; var sum = numbers.reduce((total, num) => total + num, 0); console.log(sum); // 15 // 数组最大值 var max = numbers.reduce((a, b) => Math.max(a, b)); console.log(max); // 5 // 统计字符出现次数 var str = "hello world"; var charCount = str.split('').reduce((count, char) => { count[char] = (count[char] || 0) + 1; return count; }, {}); console.log(charCount); // {h: 1, e: 1, l: 3, o: 2, ' ': 1, w: 1, r: 1, d: 1} some和every // some:是否存在满足条件的元素 var numbers = [1, 2, 3, 4, 5]; var hasEven = numbers.some(n => n % 2 === 0); console.log(hasEven); // true // every:是否所有元素都满足条件 var allPositive = numbers.every(n => n > 0); console.log(allPositive); // true var allGreaterThanThree = numbers.every(n => n > 3); console.log(allGreaterThanThree); // false forEach遍历 var colors = ["red", "green", "blue"]; colors.forEach((color, index) => { console.log(`${index}: ${color}`); }); // 输出: // 0: red // 1: green // 2: blue 二维数组操作 计算学生平均分 // 计算每个学生的平均分 var grades = [ [89, 77, 78], [76, 82, 81], [91, 94, 89] ]; var total = 0; var average = 0.0; for (var row = 0; row < grades.length; row++) { for (var col = 0; col < grades[row].length; col++) { total += grades[row][col]; } average = total / grades[row].length; console.log("Student " + (row + 1) + " average: " + average.toFixed(2)); total = 0; average = 0.0; } // 输出: // Student 1 average: 81.33 // Student 2 average: 79.67 // Student 3 average: 91.33 计算科目平均分 // 计算每门考试的平均分 var grades = [ [89, 77, 78], [76, 82, 81], [91, 94, 89] ]; var total = 0; var average = 0.0; for (var col = 0; col < grades[0].length; col++) { for (var row = 0; row < grades.length; row++) { total += grades[row][col]; } average = total / grades.length; console.log("Test " + (col + 1) + " average: " + average.toFixed(2)); total = 0; average = 0.0; } // 输出: // Test 1 average: 85.33 // Test 2 average: 84.33 // Test 3 average: 82.67 对象操作 按键排序对象 // 按对象的某个键排序 var obj = [ {name: "Alice", age: 25}, {name: "Bob", age: 20}, {name: "Charlie", age: 30} ]; obj.sort((a, b) => a.age - b.age); console.log(obj); // [ // {name: "Bob", age: 20}, // {name: "Alice", age: 25}, // {name: "Charlie", age: 30} // ] 对象解构 // 解构赋值 var person = {name: "Alice", age: 25, city: "New York"}; var {name, age} = person; console.log(name); // "Alice" console.log(age); // 25 // 嵌套解构 var data = { user: { name: "Bob", address: { city: "Boston" } } }; var {user: {address: {city}}} = data; console.log(city); // "Boston" jQuery实用技巧 jQuery是与否 // 检查jQuery是否加载 if (typeof jQuery === 'undefined') { console.log('jQuery not loaded'); } else { console.log('jQuery loaded'); } // 检查元素是否存在 if ($('#myElement').length) { console.log('Element exists'); } jQuery引入方式 <!-- 方式1:从CDN引入 --> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <!-- 方式2:本地文件 --> <script src="/js/jquery-3.6.0.min.js"></script> <!-- 方式3:使用包管理器 --> <!-- npm install jquery --> <script src="./node_modules/jquery/dist/jquery.min.js"></script> <!-- 方式4:RequireJS --> <script> require(['jquery'], function($) { $(document).ready(function() { console.log('jQuery loaded via RequireJS'); }); }); </script> Python数据结构与算法 链表实现 基础链表 class Node: def __init__(self, value): self.value = value self.next = None def __str__(self): return str(self.value) class LinkedList: def __init__(self): self.head = None self.tail = None def addNode(self, value): node = Node(value) if self.head is None: self.head = node self.tail = node else: self.tail.next = node self.tail = node def __str__(self): if self.head is not None: index = self.head nodeStore = [str(index.value)] while index.next is not None: index = index.next nodeStore.append(str(index.value)) return "LinkedList [ " + "->".join(nodeStore) + " ]" return "LinkedList []" def generateLinkedList(numArray): linkedlist = LinkedList() for i in range(len(numArray)): linkedlist.addNode(numArray[i]) return linkedlist # 使用示例 list1 = generateLinkedList([2, 4, 3]) print(list1) # LinkedList [ 2->4->3 ] 链表相加 class ListsSum: def addLists(self, l1, l2): p1 = l1.head p2 = l2.head carry = 0 linkedlist_sum = LinkedList() while (p1 is not None) or (p2 is not None) or (carry != 0): dig_sum = carry if p1 is not None: dig_sum += p1.value p1 = p1.next if p2 is not None: dig_sum += p2.value p2 = p2.next linkedlist_sum.addNode(dig_sum % 10) carry = dig_sum // 10 return linkedlist_sum # 使用示例 solution = ListsSum() list1 = generateLinkedList([2, 4, 3]) # 342 list2 = generateLinkedList([5, 6, 4]) # 465 print(solution.addLists(list1, list2)) # 807: LinkedList [ 7->0->8 ] 栈的实现 class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() def is_empty(self): return len(self.items) == 0 def peek(self): if not self.is_empty(): return self.items[-1] def size(self): return len(self.items) # 使用示例 stack = Stack() stack.push(1) stack.push(2) stack.push(3) print(stack.pop()) # 3 print(stack.peek()) # 2 print(stack.size()) # 2 算法实践技巧 Java算法练习提示 使用Scanner处理输入 Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); String str = scanner.nextLine(); 数组初始化技巧 // 动态数组 ArrayList<Integer> list = new ArrayList<>(); // 固定大小数组 int[] arr = new int[n]; // 二维数组 int[][] matrix = new int[m][n]; 常用工具方法 // 数组排序 Arrays.sort(arr); // 数组转字符串 Arrays.toString(arr); // 填充数组 Arrays.fill(arr, value); Perl技巧集锦 Perl One-Liners 文本处理 # 删除重复行 perl -ne 'print unless $a{$_}++' file.txt # 查找重复行 perl -ne 'print if $a{$_}++' file.txt # 添加行号 perl -ne 'print "$. $_"' file.txt # 反转行顺序 perl -e 'print reverse <>' file.txt # 随机排序行 perl -e 'print shuffle <>' file.txt 数值计算 # 计算列的总和 perl -lane '$sum += $F[0]; END { print $sum }' file.txt # 计算平均值 perl -lane '$sum += $F[0]; $count++; END { print $sum/$count }' file.txt # 查找最大值 perl -lane '$max = $F[0] if !defined $max || $F[0] > $max; END { print $max }' file.txt Perl高级特性 静态变量 # 使用state定义静态变量(Perl 5.10+) use feature 'state'; sub counter { state $count = 0; return ++$count; } print counter(); # 1 print counter(); # 2 print counter(); # 3 # 老版本方法 sub counter_old { my $count; $count ||= 0; return ++$count; } 匿名子例程 # 创建闭包 sub create_counter { my $count = 0; return sub { return ++$count; }; } my $counter1 = create_counter(); my $counter2 = create_counter(); print $counter1->(); # 1 print $counter1->(); # 2 print $counter2->(); # 1 数据结构实现对比 链表的多种实现 Perl链表实现 package LinkedList; sub new { my $class = shift; my $self = { head => undef, tail => undef, }; bless $self, $class; return $self; } sub add_node { my ($self, $value) = @_; my $node = {value => $value, next => undef}; if (!defined $self->{head}) { $self->{head} = $node; $self->{tail} = $node; } else { $self->{tail}{next} = $node; $self->{tail} = $node; } } C链表实现 typedef struct Node { int value; struct Node* next; } Node; typedef struct LinkedList { Node* head; Node* tail; } LinkedList; void addNode(LinkedList* list, int value) { Node* node = (Node*)malloc(sizeof(Node)); node->value = value; node->next = NULL; if (list->head == NULL) { list->head = node; list->tail = node; } else { list->tail->next = node; list->tail = node; } } 线性表的顺序存储 指针实现(动态数组) typedef struct { int* data; int length; int capacity; } SeqList; void initList(SeqList* list, int capacity) { list->data = (int*)malloc(sizeof(int) * capacity); list->length = 0; list->capacity = capacity; } void insert(SeqList* list, int index, int value) { if (index < 0 || index > list->length) { return; // 索引越界 } if (list->length >= list->capacity) { // 扩容 int newCapacity = list->capacity * 2; int* newData = (int*)realloc(list->data, sizeof(int) * newCapacity); if (newData) { list->data = newData; list->capacity = newCapacity; } } // 移动元素 for (int i = list->length; i > index; i--) { list->data[i] = list->data[i - 1]; } list->data[index] = value; list->length++; } 引用实现(智能指针) #include <memory> #include <vector> class SmartList { private: std::shared_ptr<std::vector<int>> data; public: SmartList() : data(std::make_shared<std::vector<int>>()) {} void insert(int index, int value) { if (index >= 0 && index <= data->size()) { data->insert(data->begin() + index, value); } } int get(int index) const { if (index >= 0 && index < data->size()) { return (*data)[index]; } return -1; // 或抛出异常 } int size() const { return data->size(); } }; 二叉树遍历 递归实现 class TreeNode: def __init__(self, value): self.value = value self.left = None self.right = None def preorder_traversal(node): """前序遍历:根-左-右""" if node: print(node.value) preorder_traversal(node.left) preorder_traversal(node.right) def inorder_traversal(node): """中序遍历:左-根-右""" if node: inorder_traversal(node.left) print(node.value) inorder_traversal(node.right) def postorder_traversal(node): """后序遍历:左-右-根""" if node: postorder_traversal(node.left) postorder_traversal(node.right) print(node.value) 非递归实现(使用栈) def preorder_iterative(root): """前序遍历非递归实现""" if not root: return stack = [root] while stack: node = stack.pop() print(node.value) # 先右后左,保证左子树先处理 if node.right: stack.append(node.right) if node.left: stack.append(node.left) def inorder_iterative(root): """中序遍历非递归实现""" stack = [] current = root while current or stack: # 到达最左节点 while current: stack.append(current) current = current.left current = stack.pop() print(current.value) current = current.right 实用编程技巧 文件批量操作 Perl批量重命名 use strict; use warnings; use Cwd; my $target_dir = getcwd(); opendir(my $dh, $target_dir) || die "can't opendir $target_dir: $!"; my @files = grep { /\w/ && -f "$_" && !/^\./ } readdir($dh); for (@files) { my $file = $_; # 示例:[Alex_Holmes]_Hadoop_in_Practice(BookZZ.org).pdf # 转换为:Hadoop_in_Practice.pdf if (/^(?:\[[\S\s]+\])([\S\s]+)(?:\([\S\s]+\))\.pdf$/) { my $new_name = $1 . ".pdf"; rename($file, $new_name) || die("error in renaming: $!"); } } Python批量操作 import os import re def batch_rename(directory): pattern = re.compile(r'\[.*?\](.*?)\(.*?\)\.pdf$') for filename in os.listdir(directory): match = pattern.match(filename) if match: new_name = match.group(1) + '.pdf' old_path = os.path.join(directory, filename) new_path = os.path.join(directory, new_name) os.rename(old_path, new_path) print(f"Renamed: {filename} -> {new_name}") batch_rename('.') 文本处理技巧 删除^M字符 # Vim中删除DOS换行符 :%s/^M//g # ^M输入方法:Ctrl+V,然后Enter # Perl脚本删除^M并删除注释 open($IN, $ARGV[0]) or die "in: $@"; open($OUT, ">", $ARGV[0] . ".new") or die "out: $@"; while (<$IN>) { my $line = $_; $line =~ s/(\/\/.*)//g; # 删除C风格注释 $line =~ s/\r//g; # 删除^M print $OUT $line; } close($IN); close($OUT); # 转换并替换原文件 $command = "mv $ARGV[0].new $ARGV[0] && chmod 777 $ARGV[0] && dos2unix $ARGV[0]"; system($command); 命令行工具技巧 按行长度排序 # 按行长度从长到短排序 cat file.txt | awk '{ print length($0) " " $0; }' | sort -r -n | cut -d ' ' -f 2- # 按行长度从短到长排序 cat file.txt | awk '{ print length($0) " " $0; }' | sort -n | cut -d ' ' -f 2- 提取公共行 # 查找多个文件中的公共行 grep -F -x -f file1 file2 file3 # 查找在file1中但不在file2中的行 grep -F -x -v -f file2 file1 统计最常用命令 # 查看最常用的10个命令 history | awk '{a[$2]++} END {for(i in a) {print a[i]" "i}}' | sort -rn | head 模块化编程 创建可重用模块 # MyUtils.pm package MyUtils; use strict; use warnings; use Exporter 'import'; our @EXPORT_OK = qw(add multiply); sub add { my ($a, $b) = @_; return $a + $b; } sub multiply { my ($a, $b) = @_; return $a * $b; } 1; # 使用模块 use MyUtils qw(add multiply); print add(2, 3); # 5 print multiply(2, 3); # 6 Python模块化 # utils.py def add(a, b): return a + b def multiply(a, b): return a * b # main.py from utils import add, multiply print(add(2, 3)) # 5 print(multiply(2, 3)) # 6 性能优化技巧 尾递归优化 // 普通递归阶乘 int factorial(int n) { if (n <= 1) return 1; return n * factorial(n - 1); } // 尾递归优化版本 int factorial_tail(int n, int accumulator) { if (n <= 1) return accumulator; return factorial_tail(n - 1, n * accumulator); } int factorial(int n) { return factorial_tail(n, 1); } 记忆化技术 # Fibonacci记忆化 from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n < 2: return n return fibonacci(n - 1) + fibonacci(n - 2) # 手动实现记忆化 def fibonacci_memo(): cache = {} def fib(n): if n in cache: return cache[n] if n < 2: result = n else: result = fib(n - 1) + fib(n - 2) cache[n] = result return result return fib fib = fibonacci_memo() 小结 本文汇集了多种编程语言和工具的实用技巧: ...

August 31, 2014 · 10 min · 2011 words · s-ai-unix
多语言编程

多语言实现对比:C、Perl与Python的数据结构与算法

不同的编程语言在实现数据结构与算法时各有特点。本文将通过实际代码示例,对比C、Perl和Python三种语言在实现常见数据结构与算法时的差异,帮助开发者选择最适合的工具。 一、语言特性概览 1.1 C语言 特点: 底层语言,直接操作内存 需要手动管理内存(malloc/free) 类型系统严格 性能优异,但开发效率较低 适合系统级编程和性能敏感场景 1.2 Perl 特点: 高级脚本语言 自动内存管理 灵活的类型系统 文本处理能力强 适合快速开发和系统管理 1.3 Python 特点: 高级解释型语言 自动内存管理和垃圾回收 面向对象,语法简洁 丰富的标准库 适合快速开发和原型设计 二、栈的实现对比 2.1 C语言实现 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 #define OK 1 #define ERROR 0 typedef int Status; typedef int SElemType; typedef struct { SElemType data[MAXSIZE]; int top; } SqStack; /* 初始化栈 */ Status InitStack(SqStack *S) { S->top = -1; return OK; } /* 入栈 */ Status Push(SqStack *S, SElemType e) { if(S->top == MAXSIZE - 1) return ERROR; S->top++; S->data[S->top] = e; return OK; } /* 出栈 */ Status Pop(SqStack *S, SElemType *e) { if(S->top == -1) return ERROR; *e = S->data[S->top]; S->top--; return OK; } /* 获取栈顶元素 */ Status GetTop(SqStack S, SElemType *e) { if(S.top == -1) return ERROR; *e = S.data[S.top]; return OK; } int main() { SqStack s; InitStack(&s); Push(&s, 10); Push(&s, 20); Push(&s, 30); SElemType e; Pop(&s, &e); printf("Popped: %d\n", e); GetTop(s, &e); printf("Top: %d\n", e); return 0; } C语言特点: ...

August 20, 2014 · 7 min · 1447 words · s-ai-unix
数据结构与算法

数据结构实现系列:线性表、链表与栈的完整实现

数据结构是计算机科学的基础,掌握各种数据结构的实现原理对于编写高效程序至关重要。本文将详细介绍线性表、链表、栈等基础数据结构的实现方法。 一、线性表的顺序存储实现 线性表是最基本的数据结构之一,其顺序存储方式使用连续的内存空间来存储数据元素。 1.1 使用指针实现 #include "stdio.h" #include "stdlib.h" #include "math.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int Status; typedef int ElemType; /* 定义顺序表结构 */ typedef struct { ElemType data[MAXSIZE]; int length; } SqList; /* 初始化顺序表 */ Status InitList(SqList *L) { L->length = 0; return OK; } /* 判断顺序表是否为空 */ Status ListEmpty(SqList L) { if(L.length == 0) return TRUE; else return FALSE; } /* 清空顺序表 */ Status ClearList(SqList *L) { L->length = 0; return OK; } /* 获取顺序表长度 */ int ListLength(SqList L) { return L.length; } /* 获取第i个元素 */ Status GetElem(SqList L, int i, ElemType *e) { if(L.length == 0 || i < 1 || i > L.length) return ERROR; *e = L.data[i-1]; return OK; } /* 查找元素e的位置 */ int LocateElem(SqList L, ElemType e) { int i; if (L.length == 0) return 0; for(i = 0; i < L.length; i++) { if (L.data[i] == e) break; } if(i >= L.length) return 0; return i + 1; } /* 在第i个位置插入元素e */ Status ListInsert(SqList *L, int i, ElemType e) { int k; if (L->length == MAXSIZE) return ERROR; if (i < 1 || i > L->length + 1) return ERROR; if (i <= L->length) { for(k = L->length - 1; k >= i - 1; k--) L->data[k+1] = L->data[k]; } L->data[i-1] = e; L->length++; return OK; } /* 删除第i个元素 */ Status ListDelete(SqList *L, int i, ElemType *e) { int k; if (L->length == 0) return ERROR; if (i < 1 || i > L->length) return ERROR; *e = L->data[i-1]; if (i < L->length) { for(k = i; k < L->length; k++) L->data[k-1] = L->data[k]; } L->length--; return OK; } /* 遍历顺序表 */ Status ListTraverse(SqList L) { int i; for(i = 0; i < L.length; i++) printf("%d ", L.data[i]); printf("\n"); return OK; } 1.2 使用C++引用实现 #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef char ElemType; typedef struct { ElemType data[MaxSize]; int length; } SqList; /* 创建顺序表 */ void CreateList(SqList *&L, ElemType a[], int n) { int i; L = (SqList *)malloc(sizeof(SqList)); for (i = 0; i < n; i++) L->data[i] = a[i]; L->length = n; } /* 初始化顺序表 */ void InitList(SqList *&L) { L = (SqList *)malloc(sizeof(SqList)); L->length = 0; } /* 销毁顺序表 */ void DestroyList(SqList *&L) { free(L); } /* 判断是否为空 */ int ListEmpty(SqList *L) { return(L->length == 0); } /* 获取长度 */ int ListLength(SqList *L) { return(L->length); } /* 显示顺序表 */ void DispList(SqList *L) { int i; if (ListEmpty(L)) return; for (i = 0; i < L->length; i++) printf("%c ", L->data[i]); printf("\n"); } /* 获取第i个元素 */ int GetElem(SqList *L, int i, ElemType &e) { if (i < 1 || i > L->length) return 0; e = L->data[i-1]; return 1; } /* 查找元素 */ int LocateElem(SqList *L, ElemType e) { int i = 0; while (i < L->length && L->data[i] != e) i++; if (i >= L->length) return 0; else return i + 1; } /* 插入元素 */ int ListInsert(SqList *&L, int i, ElemType e) { int j; if (i < 1 || i > L->length + 1) return 0; i--; for (j = L->length; j > i; j--) L->data[j] = L->data[j-1]; L->data[i] = e; L->length++; return 1; } /* 删除元素 */ int ListDelete(SqList *&L, int i, ElemType &e) { int j; if (i < 1 || i > L->length) return 0; i--; e = L->data[i]; for (j = i; j < L->length - 1; j++) L->data[j] = L->data[j+1]; L->length--; return 1; } 关键区别: ...

August 19, 2014 · 9 min · 1792 words · s-ai-unix
算法与数据结构

算法实现系列:二叉树遍历与递归算法详解

树形结构是计算机科学中最重要的数据结构之一,而二叉树的遍历算法是理解递归思想的经典案例。本文将详细介绍二叉树的四种遍历方式,以及递归与非递归的实现对比。 一、二叉树的基础结构 1.1 顺序存储结构 #include "stdio.h" #include "stdlib.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 100 #define MAX_TREE_SIZE 100 typedef int Status; typedef int TElemType; typedef TElemType SqBiTree[MAX_TREE_SIZE]; typedef struct { int level, order; /* 结点的层,本层序号 */ } Position; TElemType Nil = 0; /* 设整型以0为空 */ /* 访问结点 */ Status visit(TElemType c) { printf("%d ", c); return OK; } /* 构造空二叉树 */ Status InitBiTree(SqBiTree T) { int i; for(i = 0; i < MAX_TREE_SIZE; i++) T[i] = Nil; return OK; } /* 按层序次序输入二叉树中结点的值 */ Status CreateBiTree(SqBiTree T) { int i = 0; while(i < 10) { T[i] = i + 1; if(i != 0 && T[(i+1)/2-1] == Nil && T[i] != Nil) { printf("出现无双亲的非根结点%d\n", T[i]); exit(ERROR); } i++; } while(i < MAX_TREE_SIZE) { T[i] = Nil; i++; } return OK; } /* 判断二叉树是否为空 */ Status BiTreeEmpty(SqBiTree T) { if(T[0] == Nil) return TRUE; else return FALSE; } /* 返回T的深度 */ int BiTreeDepth(SqBiTree T) { int i, j = -1; for(i = MAX_TREE_SIZE - 1; i >= 0; i--) if(T[i] != Nil) break; i++; do j++; while(i >= powl(2, j)); return j; } /* 返回T的根 */ Status Root(SqBiTree T, TElemType *e) { if(BiTreeEmpty(T)) return ERROR; else { *e = T[0]; return OK; } } /* 返回处于位置e的结点的值 */ TElemType Value(SqBiTree T, Position e) { return T[(int)powl(2, e.level-1) + e.order - 2]; } /* 给处于位置e的结点赋新值value */ Status Assign(SqBiTree T, Position e, TElemType value) { int i = (int)powl(2, e.level-1) + e.order - 2; if(value != Nil && T[(i+1)/2-1] == Nil) return ERROR; else if(value == Nil && (T[i*2+1] != Nil || T[i*2+2] != Nil)) return ERROR; T[i] = value; return OK; } /* 返回e的双亲 */ TElemType Parent(SqBiTree T, TElemType e) { int i; if(T[0] == Nil) return Nil; for(i = 1; i <= MAX_TREE_SIZE - 1; i++) if(T[i] == e) return T[(i+1)/2-1]; return Nil; } /* 返回e的左孩子 */ TElemType LeftChild(SqBiTree T, TElemType e) { int i; if(T[0] == Nil) return Nil; for(i = 0; i <= MAX_TREE_SIZE - 1; i++) if(T[i] == e) return T[i*2+1]; return Nil; } /* 返回e的右孩子 */ TElemType RightChild(SqBiTree T, TElemType e) { int i; if(T[0] == Nil) return Nil; for(i = 0; i <= MAX_TREE_SIZE - 1; i++) if(T[i] == e) return T[i*2+2]; return Nil; } /* 返回e的左兄弟 */ TElemType LeftSibling(SqBiTree T, TElemType e) { int i; if(T[0] == Nil) return Nil; for(i = 1; i <= MAX_TREE_SIZE - 1; i++) if(T[i] == e && i % 2 == 0) return T[i-1]; return Nil; } /* 返回e的右兄弟 */ TElemType RightSibling(SqBiTree T, TElemType e) { int i; if(T[0] == Nil) return Nil; for(i = 1; i <= MAX_TREE_SIZE - 1; i++) if(T[i] == e && i % 2) return T[i+1]; return Nil; } 二、递归遍历算法 递归是最自然、最直观的树遍历方式。 ...

August 13, 2014 · 7 min · 1323 words · s-ai-unix