二叉树的前序遍历

二叉树的前序遍历主要规则是:

1. 先访问父节点,左子节点次之,又子节点再次之;

2. 如果子节点包含子节点,对子节点进行前序遍历

 

代码实现如下:

 

public class TreeNode{
    //左子节点
    private TreeNode left = null;

    //又子节点
    private TreeNode right = null;

    //数据
    private int data = 0;
    


    //前序遍历访问
    private static String headFirstVisit(TreeNode root){
        if(root == null){
            return "";
        }

        if(root.left == null && root.right == null){
            return root.data + ",";
        }


        StringBuilder path = new StringBuilder(root.data + ",");
        if(root.left != null){
            path.append(headFirstVisit(root.left));
        }

        if(root.right != null){
            path.append(headFirstVisit(root.right));
        }

        return path;
    }
}

 

<think>我们正在讨论二叉树前序遍历代码。用户直接询问前序遍历的代码,并且提供了多个引用,其中引用[1][2][3][5]都涉及前序遍历的C语言实现,引用[4]是JavaScript实现。 根据用户需求,我们重点提供C语言实现(因为引用中C语言示例较多),同时也可以简要提及其他语言的实现。 前序遍历的递归方式: - 访问根节点 - 递归遍历左子树 - 递归遍历右子树 非递归方式(使用栈): - 先将根节点入栈 - 当栈不为空时,弹出栈顶节点并访问 - 然后先将右子节点入栈(如果存在),再将左子节点入栈(如果存在)【注意:由于栈是后进先出,所以先右后左,这样出栈时才是先左后右】 我们将分别给出递归和非递归的C语言代码。 注意:引用[1]中包含了前序遍历的递归和非递归代码,引用[2][3][5]也是递归实现。我们可以综合这些引用给出代码。 另外,我们还需要定义一个二叉树的节点结构,这在引用[1][3][5]中都有定义。 代码结构如下: 1. 定义二叉树节点结构 2. 递归前序遍历函数 3. 非递归前序遍历函数(使用栈) 同时,我们可以简要说明一下代码思路,并给出一个简单的创建二叉树的例子来测试。 由于用户要求生成相关问题,我们将在最后提出几个相关问题。 注意:我们引用的代码示例需要标注引用,但由于引用来源都是用户提供的,我们可以在适当的地方标注引用[1][2][3][5](因为涉及代码)。 开始回答: </think>以下是二叉树前序遍历的完整代码实现(C语言),包含递归和非递归两种方式: ### 1. 二叉树节点结构定义 ```c #include <stdio.h> #include <stdlib.h> // 二叉树节点结构体 typedef struct TreeNode { int val; // 节点值 struct TreeNode *left; // 左子树指针 struct TreeNode *right; // 右子树指针 } TreeNode; ``` ### 2. 递归实现二叉树前序遍历 ```c void preOrderRecursive(TreeNode *root) { if (root == NULL) return; // 递归终止条件 printf("%d ", root->val); // 先访问根节点 [^2] preOrderRecursive(root->left); // 递归遍历左子树 preOrderRecursive(root->right); // 递归遍历右子树 } ``` > **核心原理**:按照`根节点 → 左子树 → 右子树`的顺序递归访问[^5] ### 3. 非递归实现(使用栈) ```c void preOrderIterative(TreeNode *root) { if (root == NULL) return; TreeNode *stack[100]; // 模拟栈 int top = -1; // 栈顶指针 stack[++top] = root; // 根节点入栈 while (top >= 0) { TreeNode *node = stack[top--]; // 弹出栈顶节点 printf("%d ", node->val); // 访问节点值 // 右孩子先入栈(后出栈) if (node->right != NULL) { stack[++top] = node->right; } // 左孩子后入栈(先出栈) if (node->left != NULL) { stack[++top] = node->left; } } } ``` > **栈操作原理**:利用栈的LIFO特性,保证访问顺序为`根节点 → 左子树 → 右子树`[^1][^3] ### 4. 测试代码示例 ```c int main() { // 构建二叉树: // 1 // / \ // 2 3 // / \ // 4 5 TreeNode n1 = {1, NULL, NULL}; TreeNode n2 = {2, NULL, NULL}; TreeNode n3 = {3, NULL, NULL}; TreeNode n4 = {4, NULL, NULL}; TreeNode n5 = {5, NULL, NULL}; n1.left = &n2; n1.right = &n3; n2.left = &n4; n2.right = &n5; printf("递归前序遍历: "); preOrderRecursive(&n1); // 输出: 1 2 4 5 3 printf("\n非递归前序遍历: "); preOrderIterative(&n1); // 输出: 1 2 4 5 3 return 0; } ``` ### 遍历过程图解 ``` 访问顺序: ① 根节点 1 ② 左子树根节点 2 ③ 节点2的左孩子 4 ④ 节点2的右孩子 5 ⑤ 根节点1的右子树 3 输出序列:1 → 2 → 4 → 5 → 3 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值