牛客NC373 二叉搜索树最小差值【simple 中序遍历 Java,Go,PHP】

题目

在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/f8ac976b49bd450887b9281f315186c7

核心

	中序遍历

参考答案Java

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型
     */
    public int minDifference (TreeNode root) {
        //中序遍历
        Stack<TreeNode> s = new Stack<>();
        TreeNode prev = null;

        int ans = -1;
        while (!s.isEmpty() || root != null) {
            while (root != null) {
                s.add(root);
                root = root.left;
            }

            root = s.pop();

            if (prev != null) {
                if (ans == -1) {
                    ans = Math.abs(root.val - prev.val);
                } else
                    ans = Math.min(ans, Math.abs(root.val - prev.val));
            }

       
            prev = root;

            root = root.right;
        }

        return ans;
    }


}

参考答案Go

package main


import . "nc_tools"

/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @return int整型
 */
func minDifference(root *TreeNode) int {
	//中序遍历,Go中用切片模拟栈
	stk := []*TreeNode{}
	var prev *TreeNode = nil
	ans := -1

	for len(stk) > 0 || root != nil {

		for root != nil {
			stk = append(stk, root)
			root = root.Left
		}

		size := len(stk)

		root = stk[size-1]

		if prev != nil {

			if ans == -1 {
				ans = root.Val - prev.Val
			} else {
				diff := root.Val - prev.Val
				if ans > diff {
					ans = diff
				}
			}
		}

		prev = root

		stknew := stk[:size-1]

		stk = stknew

		root = root.Right

	}

	return ans
}

参考答案PHP

<?php

/*class TreeNode{
    var $val;
    var $left = NULL;
    var $right = NULL;
    function __construct($val){
        $this->val = $val;
    }
}*/

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型
 */
function minDifference( $root )
{
    //中序遍历,栈。PHP用数组模拟
    $stk = array();
    $prev = null;
    $ans = -1;
    $idx = 0;
    while (count($stk) > 0 || $root != null) {
        while ($root != null) {
            array_push($stk,$root);
            $root = $root->left;
        }

        $root = array_pop($stk);

        if ($prev != null) {
            $diff = $root->val - $prev->val;
            if ($ans == -1) {
                $ans = $diff;
            } else {
                if ($ans > $diff) {
                    $ans = $diff;
                }
            }
        }

        $prev = $root;

        $root = $root->right;

    }
    return $ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值